Ngrx如何在OnPush策略中触发Angular的变更检测

时间:2019-10-06 21:05:01

标签: angular ngrx angular-changedetection

使用Angular OnPush策略,仅当ref更改@Input()变量时,才会触发更改检测。

但是,当使用Ngrx时,我们订阅了商店的选择器,并且Angular的OnPush策略检测了这些订阅中的更改,即使这些更改没有在输入变量中传递。

我的问题是这如何工作? Angular如何使用OnPush策略检测Ngrx存储中的更改,而无需通过输入变量传递这些更改?

我尝试在api中搜索答案,然后尝试在Github中扫描Ngrx代码,但到目前为止还算不上成功。如果您知道在源代码中我缺少的Ngrx代码片段在哪里,那么您会很开心。

1 个答案:

答案 0 :(得分:1)

如果对对象的引用未更改,则OnPush不会在对象树中搜索更改。

prop = { val: 1 };

和模板中

{{ prop.val }}

如果您使用的是OnPush

prop.val = 2;

不会更新绑定,因为它不会检查对象的更改,因为它是相同的引用。

您需要使用

prop = { val: 2 };

由于NgRx中的化简器应使用不使对象变异但创建对象的新实例的纯函数,因此您应该对使用OnPush更改检测充满信心。

别走NgRx之路的疯狂之路,毒害您的项目。 Redux不属于Angular生态系统。了解RxJ以及如何使用行为主题开发结构良好的服务,并且如果您的行为主题仅发出新的对象而不是使对象发生变异,则还可以使用OnPush。

Angular需要摆脱这种普遍的误解,即NgRx是goto Angular状态管理模式。几周前,我在NgRx核心团队的Mike Ryan的一次演讲中,我的问题是他对这种误解的感觉以及有多少新手直接使用它,他的回答是过度使用是团队需要的东西地址。