Angular Ngrx如何触发角度';OnPush策略中的s变化检测

Angular Ngrx如何触发角度';OnPush策略中的s变化检测,angular,ngrx,angular-changedetection,Angular,Ngrx,Angular Changedetection,使用Angular OnPush策略,只有当@Input()变量被ref更改时,才会触发更改检测 然而,当使用Ngrx时,我们订阅商店的选择器,Angular的OnPush策略检测这些订阅中的更改,即使它们没有传入输入变量 我的问题是这是如何工作的?如何使用OnPush策略检测Ngrx存储中的变化而不通过输入变量 我尝试在api中搜索答案,然后尝试在Github中扫描Ngrx代码,但到目前为止运气不佳。如果您知道我在源代码中丢失的Ngrx代码段在哪里,那么您将成为我的一天。如果对对象的引用没有更

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

然而,当使用Ngrx时,我们订阅商店的选择器,Angular的OnPush策略检测这些订阅中的更改,即使它们没有传入输入变量

我的问题是这是如何工作的?如何使用OnPush策略检测Ngrx存储中的变化而不通过输入变量


我尝试在api中搜索答案,然后尝试在Github中扫描Ngrx代码,但到目前为止运气不佳。如果您知道我在源代码中丢失的Ngrx代码段在哪里,那么您将成为我的一天。

如果对对象的引用没有更改,OnPush不会在对象树中搜索更改

prop = { val: 1 };
在模板中

{{ prop.val }}
如果您正在使用OnPush

prop.val = 2;
不会更新绑定,因为它不会检查对象的更改,因为它是相同的引用

你需要使用

prop = { val: 2 };
由于NgRx中的reducer应该使用纯函数,这些函数不会改变对象,而是创建新的对象实例,因此您应该有信心使用OnPush更改检测

不要走在NgRx道路上的疯狂之路去毒害你的项目。Redux不属于角度生态系统。学习RxJs以及如何使用行为主体开发构造良好的服务,如果您的行为主体只发出新对象而不是变异对象,您也可以使用OnPush


Angular需要打破这种常见的误解,即NgRx是goto Angular state管理模式。几周前,我参加了NgRx核心团队的Mike Ryan的一次演讲,我的问题是他对这种误解的感受以及有多少新手直接使用它,他的回答是团队需要解决过度使用的问题。

我的问题不是NgRx如何触发变化检测的一般问题。它实际上更具体:OnPush策略声明只检测输入变量中的变化,所以问题是当Ngrx变化没有传递到输入变量中时,它如何检测Ngrx变化?这不仅仅是关于输入变量,它与Ngrx无关,这是因为对象正在被ref改变,而不是改变对象的属性。你说它不仅仅是输入变量是什么意思?如果在使用OnPush策略时按ref更改常规非输入对象,则不会导致更改检测通过组件。您需要使用detectChanges/markForCheck使其工作。ha I大多数文章只说明onpush策略只监视输入变量,学习新东西总是很好的。因此,就我现在从您提供的代码和我阅读的一些额外研究中了解到的情况而言,onpush也会在触发事件时引发更改检测(即使更改的变量没有输入)。但是,它仍然不会在诸如setTimeout()/setInterval()之类的事件上触发。订阅商店的选择器是否是触发onpush中的更改检测而不是超时/间隔的事件?