所以我有这个让我疯狂的! 我有一个自定义组件,
<InputEdit [style]="stylesDesc" [showIcon]="true" [editable]="true" [value]="nameEmail"></InputEdit>
我将一个值传递给nameEmail .... 但是,在我已经实例化InputEdit之后,我传递了值LATER。我可以看到InputEdit实际上正在接收我传递的值但是UI没有反映我传递异步的值(从服务器返回后)。
我尝试在该组件及其父组件上禁用所有changeDetection(或设置为ChangeDetectionStrategy.CheckAlways)。
我甚至试图通过疯狂极端更新zone.js:
setTimeout(()=> {
self.ref.detectChanges();
self.appRef.tick();
self.zone.run(() => {
console.log('enabled time travel');
});
}, 3000);
在InputEdit及其父组件上,无论我做什么,我似乎无法更新UI ...除非我在断点处设置服务器的数据,一切都很好......很奇怪!
任何想法?
这里是InputEdit组件,没什么特别的: https://github.com/born2net/studioDashboard/blob/master/src/comps/inputedit/InputEdit.ts
谢谢,
肖恩。
答案 0 :(得分:0)
我删除了changeDetection:ChangeDetectionStrategy.OnPush
并通过以下方式手动强制CD:
constructor(private ref:ChangeDetectorRef) {
}
updateUi() {
try {
this.ref.detectChanges();
} catch (e) {
}
}
我仍然不知道为什么我必须这样,因为我正在更新值的组件是一个子组件并在我的模板中指定,所以即使没有ref.detectChanges(),更改检测也应该启动...但这似乎解决了这个问题。我必须将它包装在一个catch中,以避免在导航时对已销毁的引用进行堆栈挂起调用...
问候
肖恩