У меня есть приложение Angular 9, использующее NGRX, которое по большей части использует наблюдаемые / субъекты и трубу assyn c.
У меня есть компонент navbar, который имеет следующее HTML:
<ul class="navbar-nav">
<li class="nav-item" *ngFor="let menuItem of navbarMenuItems | async">
<a id="{{ menuItem.id }}" [routerLink]="menuItem.routerLink" class="nav-link">
<span><i class="icon" [className]="menuItem.iconClass"></i>{{ menuItem.translationKey | translate }}</span>
</a>
</li>
</ul>
navbarMenuItems - это наблюдаемый массив, который я присоединяю в своем компоненте методом ngOnInit:
this.navbarMenuItems = this.navbarService.getNavbarMenuItems();
NavbarService выглядит так:
@Injectable({
providedIn: "root"
})
export class NavbarService {
public navbarMenuItems = new Subject<NavbarActionModel[]>();
constructor(
) { }
updateNavbarMenuItems(items: NavbarActionModel[]) {
this.navbarMenuItems.next(items);
}
getNavbarMenuItems(): Observable<any> {
return this.navbarMenuItems.asObservable();
}
}
Все отлично работает при вызове метода updateNavbarMenuItems () NavbarService из любого другого компонента (т.е. navbar обновляет и показывает действия, которые вы отправляете).
Однако, если я вызываю updateNavbarMenuItems () в NavbarComponent (то есть с метод HTML) ngOnInit HTML не обновляется. НО если я вызову метод обновления в методе ngAfterViewInit (), они появляются.
Мой коллега помог мне решить проблему и сказал, что это из-за состояния гонки, когда * ngFor не отображается вовремя, что кажется правильным. Тем не менее, это кажется мне действительно странным, и я чувствую, что, должно быть, я делаю что-то еще неправильно, и в моем коде есть другая ошибка / лучшая практика, которой не следуют, если кто-то может помочь?