Angular2更改检测缺少我指定的值...(异步)

时间:2016-03-02 23:01:32

标签: angular

所以我有这个让我疯狂的! 我有一个自定义组件,

<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

谢谢,

肖恩。

1 个答案:

答案 0 :(得分:0)

我删除了changeDetection:ChangeDetectionStrategy.OnPush

并通过以下方式手动强制CD:

constructor(private ref:ChangeDetectorRef) {
}

updateUi() {
    try {
        this.ref.detectChanges();
    } catch (e) {
    }
}

我仍然不知道为什么我必须这样,因为我正在更新值的组件是一个子组件并在我的模板中指定,所以即使没有ref.detectChanges(),更改检测也应该启动...但这似乎解决了这个问题。我必须将它包装在一个catch中,以避免在导航时对已销毁的引用进行堆栈挂起调用...

问候

肖恩