簡體   English   中英

Angular 2更改檢測:OnPush

[英]Angular 2 Change detection: OnPush

我了解,如果輸入屬性發生更改(還有其他方法),更改檢測將觸發OnPush標記的組件。

但是我的子組件沒有輸入屬性,並且組件中已注入了服務。 我已訂閱該子組件內部服務公開的可觀察對象。 現在,在訂閱回調方法中,我更改了子組件的私有屬性值之一。 組件的模板已綁定到此屬性。

因此,問題在於觀察者發布事件時,將調用我的訂閱者回調,該事件會更改屬性值,但視圖無法反映所做的更改。 僅當我單擊頁面中的某個位置時,UI才會更新。

changeDetection: ChangeDetectionStrategy.OnPush

更新1:添加了Plunker

因此,評論完全正確。 markForCheck()會使它上升到根,但這不是一件壞事。

如果您的應用程序是: root > section > page > area > row > list並且您在list上進行了更改,則您想通知父項已發生更改。 也許現在您需要變得更大,因為加載了更多的數據,或者觸發了滾動,或者各種各樣的東西。

但請記住,你將不得不等待打勾,如果你正在使用onPush()的父母,以及沒有被告知孩子已經與改變markForCheck()檢測將永遠達不到你的孩子,這就是為什么它去一路走來。

另一種方法是使用detectChanges()手動觸發。此方法僅在本地組件上運行,並將名為detectChanges()的節點視為根節點。

另外,如果您要顯示組件的任何屬性,那么從技術上講它不是私有的。 當然可以使用Javascript,但可以使用測試套件,而且我認為甚至編譯器也會抱怨。 如果您必須執行此操作,請使用公共獲取程序進行顯示。如下所示:

Private _mySuperSecret: 'I am Batman';
Public get mySecret() { return this._mySuperSecret; };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM