我在Ionic2/Angular2項目中。在那裏,我有一個Angular2未檢測到陣列中的更改
*ngFor="let item of items | async | customPipe"
。因爲items
是Observable<Item[]>
。我的customPipe
在第一次運行時工作正常。但是,如果通過我的customPipe
篩選出的項目仍然顯示,我會對其進行更改。
有什麼問題? *ngFor
只能運行一次嗎?或者我必須強制DOM更新?謝謝你的幫助。
我在Ionic2/Angular2項目中。在那裏,我有一個Angular2未檢測到陣列中的更改
*ngFor="let item of items | async | customPipe"
。因爲items
是Observable<Item[]>
。我的customPipe
在第一次運行時工作正常。但是,如果通過我的customPipe
篩選出的項目仍然顯示,我會對其進行更改。
有什麼問題? *ngFor
只能運行一次嗎?或者我必須強制DOM更新?謝謝你的幫助。
根據Angular2管文檔:
角僅執行當檢測到純變化到輸入值的純管。純粹的變化是對原始輸入值(字符串,數字,布爾,符號)或已更改的對象引用(日期,數組,函數,對象)的更改。
Angular忽略(複合)對象內的更改。如果我們更改輸入月份,添加到輸入數組或更新輸入對象屬性,它將不會調用純管道。
原因:
這看似嚴格,但也快。對象引用檢查速度快 - 比深入檢查差異要快 - 這樣Angular可以快速確定它是否可以跳過管道執行和視圖更新。
因此,當您更改數組或數組內的元素時,數組引用不會更改。
因此切換到.onPush
或手動觸發更改檢測可能會解決您的問題。
來源:https://angular.io/docs/ts/latest/guide/pipes.html#!#pure-and-impure-pipes
感謝您的鏈接。我現在改變了我的管道到'pure:false',它現在正在按預期工作。你能告訴我關於'.onPush'的更多細節嗎?它是什麼以及它放在哪裏?謝謝 – SoS
@SoS你只需在'@ Component'註釋中加入'changeDetection:ChangeDetectionStrategy.OnPush'。它告訴角度來處理任何輸入,就好像它們是不可變的。如果你有興趣,網上有更詳細的信息。 – echonax
使用changeDetection:ChangeDetectionStrategy.OnPush並手動觸發ChangeDetectorRef detectChanges()不適用於我 – teejay
好吧,我剛剛發現這一點:http://stackoverflow.com/questions/34456430/ngfor-doesnt-update-data-with-pipe-in-angular2 我給它嘗試...在我讀了它之後.. – SoS