Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Homework 5 #5

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open

Homework 5 #5

wants to merge 10 commits into from

Conversation

zadorotskas
Copy link
Collaborator

No description provided.

Copy link
Member

@BusinessDuck BusinessDuck left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему выбрал функциональный стиль? Какие плюсы? Вот мой пример в ООП стиле просто для справки. Все можно оставить в текущем стиле, только поправить замечания.

export class Skill {
    constructor(readonly name: string, readonly value: number) {}
}

export class SkillList {
    private list: Array<Skill>;

    constructor() {
        this.list = [];
    }

    add(skill: Skill) {
        this.list.push(skill);
    }

    remove(skill: Skill) {
        this.list.splice(this.list.indexOf(skill), 1);
    }
}

export class SkillView {
    constructor(private skill: Skill) {}

    render() {
        return this.HTML(`<div class="skill">${this.skill.name}<span>${this.skill.value}</span></div>`);
    }

    private HTML(str: string) {
        // @ts-ignore
        return repalceHtmlEntities(str);
    }
}

export class SkillListView {
    private list: Array<SkillView>;

    render() {
        return this.list.map(skill => skill.render()).join('');
    }
}

export class SkillListController {
    private skillList: SkillList;
    private skillListView: SkillListView;

    constructor(private target: Element) {...}

    addSkill(...) {
        // ...
        const skill = new Skill('123', 33);
        this.skillList.add(skill);
        this.target.innerHTML = this.skillListView.render();
    }
}

// index.ts

const target = document.querySelector('.target');
const skillController = new SkillListController(target);

// В идеале вообще использовать Observer Pattern

// index2.ts
const target = document.querySelector('.target');
const model = new SkillList();
const skillController = new SkillListController(target, model);

function addSkill() {
    model.push({ name: 'asdf', value: 33 });
}

function removeSkill(idx) {
    model.removeSkill(idx);
}

// И где-то внутри контроллера скилов
// Мы подписались на изменения модели, то есть при добавлении и удалении элемента вызовется коллбек. Паттерн 
 Observer можно посмотреть тут
https://monsterlessons.com/project/lessons/observer-pattern-v-javascript
this.model.subscribe((model => {});

src/app.js Outdated
@@ -0,0 +1,69 @@
function setTheme(themeName) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В настройках Rollup, укажи вместо 'esm' -> 'iife' сборку, и тгда можно будет использовать import конструкцию, обязательно разбей все тут на несколько файлов JS разных чтобы было проще понять что происходит.

src/app.js Outdated
document.addEventListener("DOMContentLoaded", function (event) {
document.getElementsByClassName("change-theme-button").item(0).addEventListener('click', toggleTheme);

document.getElementsByClassName("skills__button").item(0).addEventListener('click', () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

используй событие формы сабмит а не клик, так будет работать enter, для добавления элементов.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/formdata_event

src/app.js Outdated
skillDiv.classList.add('skill__info');
skillDiv.innerHTML =
` <div class="skill__delete">
<button class="skill__delete-button"> - </button>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI (просто для справки) еще альтернативный подход к шаблонизации https://developer.mozilla.org/ru/docs/Web/HTML/Element/template

createSkill('JavaScript', 15);
createSkill('Java', 80);
createSkill('KOTLIN!!1!', 70);
createSkill('Поедание пельменей', 100);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это + 2 балла

Copy link
Member

@BusinessDuck BusinessDuck left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Что понравилось

  1. Верстка в целом выглядит красиво, но есть проблемки мелкие
  2. Работают горячие клавиши по добавлению
  3. Очень локаничный код в функциональном стиле
  4. Есть XSS защита

Что не понравилось

  1. Все в одном файле нет импортов
  2. Кнопки некоторые мелковаты и не вписываются в UI, выделяются, также кнопка добавления огромная очень
  3. Вероятно стоило бы разделить страницу на 2, одна со скилами другая просто с текстом

Итого: 38/40

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants