angular - ngrx 动作触发 ExpressionChangedAfterItHasBeenCheckedError 异常
问题描述
我正在启动一个使用 ngrx 进行状态管理的 Angular 应用程序,我遇到了一个让我有点困惑的问题:
UI 操作之一是使用加载程序阻止屏幕,还有另一个取消阻止它:
import { createAction } from "@ngrx/store";
export const blockUI = createAction("[UI] Block UI");
export const unblockUI = createAction("[UI] Unblock UI");
true
关联的 reducer 仅在操作之间或false
取决于操作触发标志:
export const uiReducer = createReducer<UiState>(initialState,
...
on(blockUI, (state) => ({ ...state, blockUi: true })),
on(unblockUI, (state) => ({ ...state, blockUi: false })),
...
我在主应用程序的组件中订阅此状态标志以显示/隐藏 UI 阻止程序:
this.store.pipe(
select((state) => state.ui.blockUi),
distinctUntilChanged()
).subscribe(
(blockUi) => {
console.log("Block UI: ", blockUi);
this.loading = blockUi;
}
);
我正在使用distinctUntilChanged
rxjs 运算符来丢弃相等的标志值,因为可以同时从多个组件分派阻止/解除阻止操作:
这是 HTML 模板中阻止 UI 的组件(我使用 PrimeNG BlockUI):
<!-- Component to block/unblock the UI -->
<p-blockUI [blocked]="loading">
<div class="divCenterHV">
<p-progressSpinner></p-progressSpinner>
</div>
</p-blockUI>
在我看来,一切都应该正常,但是当我运行应用程序时,我收到以下错误:
我可以很容易地delay(1)
在状态订阅中添加一个 rxjs 运算符来解决它,但我想知道为什么会触发异常,因为我找不到原因......
非常感谢!
解决方案
这不是你如何对动作做出反应的问题,而是你何时分派动作的问题。调度可能发生在已经检查了一些代码之后(在父组件中的某个地方),可能在 ngOnInit 或 ngOnChanges 中,或者它对输入做出反应。很难说,因为您没有包含您发送的代码,但我确信这是问题所在。
推荐阅读
- r - 重新编码嵌套在 (100k+) 个用户 ID 中的(不相等数量的)日期
- django - 如何在 django 模板中从 for 循环中转义一行
- android - 通过蓝牙经典在 Android 中进行 SSL 握手
- python - 错误:(gcloud.beta.ai-platform.versions.create)参数版本:必须指定
- javascript - JavaScript - 变量的数学运算
- javascript - Reactjs 中的 setState 不是函数
- python - 为什么我的 python 没有正确安装,即使我没有错误?
- javascript - 在输入的检查状态下更改标签背景
- intellij-idea - 如何告诉 intellij 在失败的命令上恢复宏执行?
- javascript - 将对象数组分解为二维数组