【发布时间】:2020-06-19 05:50:11
【问题描述】:
我有一个使用 NGRX 的 Angular 9 应用程序,该应用程序大部分使用 observables/subjects 和 assync 管道。
我有一个具有以下 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();
}
}
从任何其他组件调用 NavbarService updateNavbarMenuItems() 方法时一切正常(即导航栏更新并显示您发送的操作)。
但是,如果我在 NavbarComponent(即带有 HTML 的那个)ngOnInit 方法中调用 updateNavbarMenuItems(),则 HTML 不会更新。 但是如果我在 ngAfterViewInit() 方法中调用 update 方法,它们确实会出现。
我的一位同事帮助我解决了这个问题,并告诉我这是因为 *ngFor 没有及时呈现的竞争条件,这似乎是正确的。但是,这对我来说似乎真的很奇怪,我觉得我一定做错了什么,如果有人可以提供帮助,我的代码/最佳实践中还有另一个错误?
【问题讨论】:
-
只要您在 ~create~ set
this.navbarMenuItems(在您的导航栏组件内)更新值,Observable 流就应该正确更新。 -
我会(或者至少我认为我会通过调试工具),这就是为什么我认为我的问题可能与渲染无关!这感觉与我所做的许多其他工作相似(即将 ngFor 集合设置为可观察对象)。
-
我个人不会使用
async管道。如果您只是在组件中订阅该主题,并在那里分配结果,它应该可以正常工作。 -
为什么不使用 aync 管道?这对我来说感觉像是一个更清洁的解决方案,但也许我错了?
-
另外,您可以尝试使用
BehaviorSubject或ReplaySubject。另一种选择是初始化navbarMenuItems = of(EMPTY)以确保您不会遇到 DOM 渲染问题。
标签: angular observable ngrx