Вот пример того, как вы можете это сделать: https://stackblitz.com/edit/github-ck3u8u-wns7vr
Но я очень рекомендую вам взглянуть на angular тур героев ( https://angular.io/tutorial) и проверьте, как работает маршрутизация, используя [routerLink]
и [routerLinkActive]
. Если вы используете их и отказываетесь от маршрутизации bootstrap, выделение будет работать «из коробки», и весь дополнительный код, который будет объяснен ниже, не понадобится.
Но для решения Ваша текущая проблема:
Чтобы Pu sh ваши новые пользователи в верхней части списка, измените
public addNewButton() {
this.userList = [{"Id": 0,
"agentCode": 1205,
"userName": 'addNewButton',
"firstName": "new",
"middleName": '',
"lastName": '2',
"department": 'New department1',
}]
this.userDetails = this.userList[0]
}
на
public addNewButton() {
this.userList = [{"Id": 0,
"agentCode": 1205,
"userName": 'addNewButton',
"firstName": "new",
"middleName": '',
"lastName": '2',
"department": 'New department1',
}, ...this.userList]
this.userDetails = this.userList[0]
}
Это будет предшествовать Элемент для вас уже существующий список.
Далее мы хотим решить проблему выделения первого элемента при загрузке и новых элементов после того, как они были созданы нажатием кнопки. Для этого нам нужно выбрать привязки вашего правого списка как ViewChildren. К сожалению, невозможно выбрать html нативные элементы в качестве ViewChildren, поэтому мы создаем фиктивную директиву, которая применяется к якорям и может быть выбрана с помощью ViewChildren.
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appSelectableAnchor]'
})
export class SelectableAnchorDirective {
constructor(
private elementRef: ElementRef<HTMLAnchorElement>
) { }
public removeBootstrapActive() {
this.elementRef.nativeElement.classList.remove('active');
}
public setBootstrapActive() {
this.elementRef.nativeElement.classList.add('active');
}
}
эта директива затем применяется к якоря в app.component.html
<a class="nav-link" id="user_{{user.Id}}" data-toggle="pill" href="#tab-user_{{user.Id}}" role="tab"
aria-controls="tab-user_1" aria-selected="true" *ngFor="let user of userList" (click)="selectedUser(user)" appSelectableAnchor>
Теперь мы можем выбрать якоря как ViewChildren в app.component.ts
@ViewChildren(SelectableAnchorDirective) selectableUsers: QueryList<SelectableAnchorDirective>;
Чтобы выбрать первый после загрузки, мы проверяем ViewChildren в ngAfterViewInit (в ngOnInit не гарантируется, что ViewChildren уже загружены), если они есть, мы выбираем первое.
ngAfterViewInit() {
if (this.selectableUsers.length > 0) {
this.selectableUsers.first.setBootstrapActive();
}
}
Чтобы сделать то же самое при добавлении нового пользователя, нам нужно запустить цикл обнаружения изменений после того, как пользователь был добавлен в список, чтобы обновить ViewChildren. После этого мы можем выделить новый элемент в том же ключе, что и в ngAfterViewInit.
По какой-то причине активный класс задерживается, если вставлен новый элемент. Поэтому мы удаляем его вручную перед добавлением нового пользователя. В целом метод addNewButton
выглядит следующим образом:
public addNewButton() {
if (this.selectableUsers.length > 0) {
this.selectableUsers.first.removeBootstrapActive();
}
this.userList = [{"Id": 0,
"agentCode": 1205,
"userName": 'addNewButton',
"firstName": "new",
"middleName": '',
"lastName": '2',
"department": 'New department1',
}, ...this.userList]
this.userDetails = this.userList[0]
this.cdr.detectChanges();
if (this.selectableUsers.length > 0) {
this.selectableUsers.first.setBootstrapActive();
}
}