角 6.0.1。
这个问题在一个大型应用程序中表现出来,但我创建了一个简单的组件来尝试看看发生了什么。简单组件有一个简单的模板:
{{myProp}}
在 ngOnInit 中,我设置this.myProp = 'hello';
并在屏幕上看到了hello这个词,正如我所期望的那样。到目前为止,一切都很好。
但是,如果我现在尝试更新myProp
a的值setTimeout
,它永远不会更新 UI:
this.myProp = 'hello';
setTimeout(() => {
this.myProp = 'goodbye';
}, 3000);
UI 中显示的值仍然是hello。
如果我注入ChangeDetectorRef
我的构造函数并cdr.detectChanges()
在计时器内调用,则 UI 会更新。
这是预期的行为,还是我做错了什么?我不希望不得不为此打电话detectChanges
。我没有更改ChangeDetectorStrategy
组件的,所以它仍然是default
.
请注意,在“真实”应用程序中,我不是myProp
在计时器中更新,而是在Observable
订阅中更新。UI 没有在那里更新,这就是导致我对此进行调查并在计时器处结束的原因,因为它是问题的最简单的可能再现。据我所知,以任何类型的异步方式更新属性值都不会显示 UI 中的更改。
更新
我认为我对 setTimeout 的引用使事情变得混乱。我用它作为调试的手段。我没有尝试重新处理这个问题,而是在此处发布了一个新问题(Angular interpolated value not updated on subscription),提供了更好的解释和让我感到悲伤的 ngRx 代码。
更新 #2
问题是由将其ChangeDetectionStrategy
设置为OnPush
. 请参阅我上面提到的问题。