Доступ к n-му дочернему элементу списка запросов ViewChildren (Angular)

Я пытаюсь получить доступ к n-му дочернему списку запросов viewchildren.

Ниже мой ТС:

@ViewChildren(PopoverDirective) popovers: QueryList<PopoverDirective>;
console.log(this.popovers)

В console.log отображаются изменения: первое, последнее, длина и _results.

Как я могу получить доступ к n-му ребенку (т.е. 3-му, а не первому)?

Когда я пытаюсь сделать это с помощью _results (т. е. this.popovers._results[2]), я получаю сообщение об ошибке.

Спасибо.


person user749798    schedule 18.04.2019    source источник


Ответы (3)


На самом деле есть несколько способов, с помощью которых вы можете получить доступ к определенному внутри вас QueryLists

1-й метод: .filter()

Вы также можете использовать .map и .reduce в зависимости от ваших предпочтений

// Since if you have 3 items in an array, the counting starts at 0, so 1 is the 2nd element
const elementTwo = this.popovers.filter((element, index) => index === 1);


// Or if you want to be specific based on the data inside the PopoverDirective
// and if that PopoverDirective has an @Input() name, you can access it by:
const elementTwo = this.popovers.filter((element, index) => element.name === 'John');

2-й метод: .forEach()

// You can perform any action inside the .forEach() which you can readily access the element
this.popovers.forEach((element, index) => console.log(element));

3-й метод: первый и последний

this.popovers.first         // This will give you the first element of the Popovers QueryList

this.popovers.last          // This will give the last element of the Popovers QueryList

Необработанный список массивов: .toArray()

this.popovers.toArray();    // This will give you the list of popovers caught by your QueryList
person KShewengger    schedule 18.04.2019
comment
Фильтр не возвращает массив? - person Qian Chen; 02.10.2019
comment
Привет @QianChen, фильтр возвращает массив. - person KShewengger; 03.10.2019
comment
Большое спасибо за разъяснения. Что, если я хочу перебрать QueryList<ElementRef>? Это что-то меняет? (У меня сейчас проблемы с этим, но, возможно, я пропустил что-то очевидное). - person Crowdpleasr; 10.10.2019
comment
Привет @Crowdpleasr, вы все равно можете применить их, даже если мы должны были составить список запросов в элементе. Прикрепил демонстрацию Stackblitz для справки — вы можете проверить консоль. stackblitz.com/edit/ngx-viewchildren-querylist - person KShewengger; 13.10.2019
comment
toArray() каждый раз создает фрагмент результатов базового списка запросов. Что нужно иметь в виду для производительности. - person crush; 05.12.2020

вы можете использовать метод toArray(), а затем вы можете получить доступ по индексу.

person ABOS    schedule 18.04.2019

Доступ по индексу возможен через Find

  @ViewChildren(PopoverDirective) popovers: QueryList<PopoverDirective>;

  public getByIndex(x: number) {
    return this.popovers.find((_, i) => i == x)
  }
person Rafi Henig    schedule 11.07.2020
comment
На самом деле я обнаружил, что этот метод работает быстрее, чем вызов toArray(). toArray() создает срез базового списка запросов перед доступом к индексу. Между тем, find() работает с исходным базовым массивом списка запросов. Таким образом, это не только быстрее, но и сэкономит память. - person crush; 05.12.2020