2017-10-20 47 views
0

我有一個帶有布爾變量的Angular 4組件。初始值取決於輸入流。在哪裏初始化角4組件中的變量 - ExpressionChangedAfterItHasBeenCheckedError

TypeScript要求我聲明變量,如下例所示。沒有它,this.isLoading會觸發錯誤。

在這一點上,我不知道它的價值,所以我只聲明它沒有分配一個變量。

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    isLoading: boolean; 

    ngOnInit() { 
    someStream.subscribe((someData) => { 
     // Code to determine the value for isLoading 
     this.isLoading = true; 
    }); 
    } 
} 

後來當我知道值時,我會將它設置爲true或false。但後來'ExpressionChangedAfterItHasBeenCheckedError'開始。

什麼是設置這些'默認'值的'正確方法'。

+0

嘗試ngOnChages()生命週期而不是ngOnInit(),它可能會解決您的問題。 –

+0

何時何地在someStream上調用next? –

+0

@MohamedGara在同一個onInit塊中是一些檢查URL參數的邏輯。如果所有需要的參數都在那裏,它會啓動一個http調用並設置isLoading。 –

回答

0

我認爲isLoading是你的標誌,知道請求是否完成。 我在這種情況下所做的是初始化加載假:直接

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    // Initialized as false. 
    isLoading: boolean = false; 

    ... 
} 

如果isLoading標誌有更多的邏輯,我會改變你的組件進行交互的方式,改變@input()來someData,和處理父級中的異步邏輯。

希望它有幫助。

+0

我試過這個,當isLoading在ngOnInit的'同一個嘀嗒'中的計算結果爲true時,它不工作我得到ExpressionChangedAfterItHasBeenCheckedError。我擔心將變量移到父級只會將問題移到另一個組件。 –

+0

有點奇怪,因爲我擁有完全相同的代碼,並且不會引發任何錯誤。可以肯定的是,您的訂閱是否僅觸發一次?也許觀察者在同一週期內發送新值。 –