[英]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.