Вы не должны так манипулировать DOM, в этом нет необходимости.Мы используем угловые привязки, и, используя их, мы также можем значительно сократить код, который вы используете в данный момент.Поэтому удалите все эти манипуляции с DOM.
Прежде всего мы можем опустить вызов lists
для родительского или дочернего элемента.Теперь вы выполняете запрос get дважды, что на самом деле не имеет смысла.Я держу запрос на получение у ребенка.Мы также можем сделать запрос в OnInit, зачем нам это нужно делать в AfterViewInit
?
ngOnInit() {
this.getUserList();
}
public getUserList() {
return this.http
// DONT USE 'ANY', type your data using interface or class
.get<any[]>("https://jsonplaceholder.typicode.com/users")
.subscribe(data => {
this.lists = data;
// you want to emit initially the first item to parent via output
// do it here.
this.onClickList(0, this.lists[0] || {})
});
}
Также мы вводим новую переменную selectedIndex
, которую мы будем изменять в зависимости от выбранного элемента.Как Дженс сделал в своем ответе.Вы хотите, чтобы первый элемент был активен изначально, мы передаем 0
в качестве индекса функции onClick
:
public onClickList(i: number, item: any) {
this.selectedIndex = i
this.selectedList.emit(Object.assign({}, item));
}
Мы добавляем это в шаблон следующим образом:
<ng-container *ngFor="let item of lists | filter: searchText; index as i">
<li [class.active]="i === selectedIndex"
(click)="onClickList(i, list)">
{{ list.name }}
</li>
</ng-container>
Ваш разветвленный STACKBLITZ
Как упомянуто как комментарий внутри кода.НЕ ИСПОЛЬЗУЙТЕ any
, он полностью отрицает цель Введите Script, поэтому вводите свои данные либо с помощью интерфейсов, либо с помощью классов.Я предпочитаю интерфейсы.