Список разделов доступа Angular 5 с использованием @ViewChildren

Я хочу получить все div, начиная с идентификатора div. Для этого я использую @ViewChildren, но я не могу получить доступ к div, потому что у меня пустой массив, почему?

Мой шаблон

<div id = "div-1">Div 1</div>
<div id = "div-2">Div 2</div>
<input type = "button" (click) = "getDivs()">

Составная часть

@ViewChildren('div') divs: QueryList<any>;
divList : any[];

getDivs(){ 
   this.divList = this.divs.filter(x => x.id.lastIndexOf('div-', 0) === 0);  
   console.info(this.divList);  
      // this.divList return an empty array but i should have two results  
}
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
20
0
25 952
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упоминалось в этот подробный ответ, допустимые селекторы для ViewChildren включают типы компонентов, типы директив и ссылочные переменные шаблона. Вы не можете получить элементы DOM с помощью ViewChildren, используя селекторы CSS, такие как типы элементов HTML (например, div) или имена классов.

Один из способов заставить его работать в вашем случае - сгенерировать элементы div с помощью цикла ngFor и связать с ними ссылочную переменную шаблона #divs:

<div #divs *ngFor = "let item of [1,2]" [id] = "'div-' + item">Div {{item}}</div>
<button (click) = "getDivs()">Get divs</button>

Затем вы можете получить их в коде с помощью ViewChildren, используя ссылочную переменную шаблона:

@ViewChildren("divs") divs: QueryList<ElementRef>;

getDivs() {
  this.divs.forEach((div: ElementRef) => console.info(div.nativeElement));
}

См. этот stackblitz для демонстрации.

Я использую Angular 8, и мне нужно было изменить оператор @ViewChildren следующим образом: @ViewChildren("divs", { read: ElementRef }) divs: QueryList<ElementRef>;

LHM 02.10.2020 05:53

Мне удалось добиться необходимого результата, создав специальную директиву и запросив ее следующим образом:

import { Directive, ElementRef, ViewChildren, Component, AfterViewInit, QueryList } from "@angular/core";

@Directive({selector: 'table th'})
export class DatatableHeadersDirective {
  nativeElement: HTMLTableHeaderCellElement = null;
  constructor(el: ElementRef) {
    this.nativeElement = el.nativeElement;
  }
}

@Component({
  selector: 'selctorname',
  templateUrl: 'htmlURL',
  styleUrls: ['styleURL'],
})
export class AwesomeDatatableComponent implements AfterViewInit {
  @ViewChildren(DatatableHeadersDirective) children: QueryList<DatatableHeadersDirective>;;

  ngAfterViewInit(){
    console.info(this.children.map(directive => directive.nativeElement))
  }
}

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