【发布时间】:2019-06-20 12:24:17
【问题描述】:
我正在开发一个大型应用程序,但在变更检测方面遇到了一些问题。
父组件ts:
使用changeDetection: ChangeDetectionStrategy.OnPush
我有一个可观察的变量
loaderOverlay$: Observable<boolean>;
this.loaderOverlay$ = this.store.pipe(
select(selectors.loaderOverlaySelector)
);
此变量从子组件的 rxjs 操作中更新。然后通过 rxjs 进程。 (动作 -> 减速器 -> 选择器)
父组件 HTML
<div *ngif="(loaderOverlay$ | async)"></div>
Child #1 组件(我正在调度我的操作):
myFunction() {
this.store.dispatch(new actions.LoaderOverlay(true));
}
我的问题是,一旦我发送动作,*ngif 就会非常不稳定。它似乎没有按照我想要的方式工作(调度操作,将值更改为 true 以便出现 div)。这很奇怪,因为如果我在减速器中console.log(action.payload),值实际上正在更新,但*ngif 不起作用。更奇怪的是,当我将鼠标悬停在某个其他组件上时,它似乎启动了。
我认为我已经将其范围缩小到更改检测,因为如果我这样做,则在父组件中:
ngAfterViewChecked(){
this.changeDetector.detectChanges();
}
这似乎对我有用。我的问题是ngAfterViewChecked 似乎被触发了很多次,我担心性能问题。
这里可能发生了什么,我可以做些什么来解决这个奇怪的问题?
【问题讨论】:
-
你真的是这样调度那个动作的吗?也许你从回调或其他什么地方调度它?因为看起来你在 NgZone 之外进行调度和操作,所以它没有被检查。
-
selectors.loaderOverlaySelector是什么?不要将状态分配给loaderOverlay$,而是尝试订阅以查看您得到的this.store.pipe( select(selectors.loaderOverlaySelector).subscribe(value => { console.log(value) }) ); -
好吧,我现在很好奇你在哪里使用 myFunction()?是来自子组件的模板吗?
-
请添加动作、存储和效果代码,以便我们看到大图,如果你能制作一个很棒的 stackblitz 示例:)
-
@cup_of 是的,
async管道可以做到这一点,但仅用于调试目的。弄清楚如何解决问题后,就可以清理了。
标签: angular ngrx-store