Задать вопрос
@Cruper
web-падаван

Как получить дочерние элементы созданные ngFor?

<select [(ngModel)]="selectedId" appSelect>
  <option #option *ngFor="let item of Items" [ngValue]="item.id ">{{item.name}}</option>
</select>


@ContentChildren('option') options: QueryList<ElementRef>;
...
ngContentViewInit() {
  this.options.changes.subscribe(...);
}


Можно ли сделать тоже самое, но без переменной шаблона #option
  • Вопрос задан
  • 445 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
EreminD
@EreminD
Кое-что умею
а как вы используте ViewChildren?
Покажите, пожалуйста
Ответ написан
@antoart
Web developer
Артем, есть еще один вариант. Он похож, но его можно встретить у различных создателей кучи всяких компонентов для ангуляра.
Использование пустых директив.
<div class="table-body">
    <ul class="table-list"
        directiveList>
      <li *ngFor="let item of items; let i = index; trackBy: trackByFn"
           class="table-item" directiveItem>
          {{item}}
      </li>
    </ul>
  </div>


Имеется директива directiveList, имеется директива directiveItem.
В классе directiveList находится список этих "дочерних" элементов.
@Directive({
  selector: '[directiveList]',
  exportAs: 'directiveList'
})
export class DirectiveList {
/**
   * Children directives which placed on items
   */
  @ContentChildren(DirectiveItem, {read: ElementRef}) // получаем сразу как список ссылок на компоненты класса
  private _items: QueryList<DirectiveItem>;
}

ngAfterContentInit() {
    this._items.changes.subscribe(() => {
      this.coolFunc();
    });

}


В чем отличие?
Ты отвязываешься от работы с элементами в компоненте. Т.к. сегодня ты хочешь что-то делать со списком элементов, а завтра не хочешь, для этого ты просто уберешь директивы. Компонент практически не изменится.

Но в любом случае через @ContentChildren.

p.s. совсем забыл. Вот сама пустая директива

@Directive({
  selector: '[directiveItem]'
})
export class ClassNewInViewItemDirective {

  constructor() { }

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы