使用Angular OnPush策略,仅当ref更改@Input()变量时,才会触发更改检测。
但是,当使用Ngrx时,我们订阅了商店的选择器,并且Angular的OnPush策略检测了这些订阅中的更改,即使这些更改没有在输入变量中传递。
我的问题是这如何工作? Angular如何使用OnPush策略检测Ngrx存储中的更改,而无需通过输入变量传递这些更改?
我尝试在api中搜索答案,然后尝试在Github中扫描Ngrx代码,但到目前为止还算不上成功。如果您知道在源代码中我缺少的Ngrx代码片段在哪里,那么您会很开心。
答案 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的一次演讲中,我的问题是他对这种误解的感觉以及有多少新手直接使用它,他的回答是过度使用是团队需要的东西地址。