Comments 23
Мне кажется, проблемы заметны уже в этом месте:
export class CheckboxItem {
value: string;
label: string;
checked: boolean;
constructor(value: any, label: any, checked?: boolean) {
this.value = value;
this.label = label;
this.checked = checked ? checked : false;
}
}
Не думаю, что автор статьи уже добрался до стратегий детектора, просто решил поделиться своим небольшим опытом (правда, я не понимаю зачем).
Я автора никак обидеть не хочу, просто статья тянет на "пишем гостевую книгу на PHP", которых на хабре было (и, наверное, еще будет вагон и маленькая тележка).
А сейчас статья выглядит как «эй, я неделю как использую ангуляр, смотри чо могу». Не в обиду автору, но ему самому неплохо было бы ещё статей почитать
ng lint немножко поможет Вам соблюдать styleguide.
Про rxjs я писал не из-за subscribe и прочего, а просто непривычно видеть здесь имитацию задержки от сервера через setTimeout, если в боевых условиях там все равно будет Observable для асинхронности. В таком случае уместнее было бы использовать of(value) и через pipe добавить delayTime оператор.
Можно сократить до такого:
export class CheckboxItem {
constructor(
public value: string,
public label: string,
public checked?: boolean
) {}
}
При условии, что вы не прокидываете так поля в сервисы. Там инжектор будет ругаться, что не может подкидывать классы без @Injectable
/
А какие вы видите проблемы в этом месте?
Как уже сказал комментатор выше, при использовании стратегии Default, детектор будет реагировать на срабатывание детекторов соседних по стеку компонентов. Использование OnPush позволит вам запускать детектор вашего компонента только тогда, когда изменятся входящие данные.
А Вы заверните в npm пакет, добавьте в другой проект и попробуйте собрать его с aot :)
- Если инпуты не являются константами или обсерваблами, то факт их изменения должен быть обработан либо в onChanges, либо в сеттерах @Input() переменных. В данном конкретном случае при изменении selectedValues после стартовой инициализации (например, если состояние, которое кладется в чекбоксы, тоже подгружается) все отвалится.
- вообще писать в onToggle() и т.п. обработчиках событий, код завязанный на факте апдейта биндинга — плохая идея, т.к. в данном случае мы имеем несколько независимых обработчиков, логика работы которых зависит от порядка их вызова (который может поменяться в следующей версии, например).
- следует осторожнее менять из события внутреннего компонента стейт внешнег окомпонента, который потом прокидывается обратно внутрь. В данном случае, если поправить п.1, то это приведет к ошибке expression changed after checked.
- есть интерфейс ControlValueAccessor и соответствующий провайдер, которые, будучи реализованы компонентом, делают этот компонент полноценным formControl с поддержкой биндингом ngModel либо реактивных форм
Angular: Создаем multiple checkbox компонент, который подойдет для повторного использования