Как использовать пользовательскую директиву на элементе хоста пользовательского компонента

У меня есть специальная директива, которая должна слушать ngModelChange пользовательского компонента и добавлять или удалять элементы в массиве.

Вот директива:

@Directive({
  selector: '[selectedItems]'
})

export class SelectedItemsDirective {
  @Input('ngModel') ngModel: boolean;
  @Input() mainNgModel: boolean;
  @Input() items: any[] = [];
  @Input() item: any;
  @Input() itemKey: string;
  @Output() itemsChange: EventEmitter<any> = new EventEmitter<any>();

  @HostListener('ngModelChange')
  modelChange() {

    const i: number = this.items.indexOf(this.item[this.itemKey]);

    if (i === -1 && this.ngModel) {
      this.items.push();
    }
    else {
      this.items.splice(i, 1);
    }

    this.itemsChange.emit(this.items);
  }
}

И тогда это будет использоваться так:

<checkbox [(ngModel)]="event.isChecked" [(selectedItems)]="selectedEvents" [items]="events" [item]="event"></checkbox>

Но это не работает, потому что:

Can't bind to 'selectedItems' since it isn't a known property of 'checkbox'.

И я предполагаю, что то же самое будет происходить и со свойствами ввода директивы.

Я не могу найти свой путь к решению, которое отдаленно близко к тому, чего я пытаюсь достичь. Я объявил и экспортировал директиву в SharedModule который я затем импортировал в модуль флажка.

Что еще мне нужно сделать, чтобы это сработало?

1 ответ

Я полагаю, вы забыли подать заявку directives на ваш @Component(),

Пример:

@Component({
    selector: 'YourApp',
    templateUrl: 'YourTemplateUrlHere',
    directives: [SelectedItemsDirective] 
})

И еще одно предложение: не пишите весь код, просто начните с привязки директивы, а затем добавьте очень простой console.log() Затем добавьте все эти двухсторонние привязки по одному.

Потратил три часа на отладку только из-за орфографической ошибки в директиве. Ура опыт:)

Другие вопросы по тегам