2016-12-16 47 views
1

我在Ionic2/Angular2項目中。在那裏,我有一個Angular2未檢測到陣列中的更改

*ngFor="let item of items | async | customPipe"

在我的代碼

。因爲itemsObservable<Item[]>。我的customPipe在第一次運行時工作正常。但是,如果通過我的customPipe篩選出的項目仍然顯示,我會對其進行更改。

有什麼問題? *ngFor只能運行一次嗎?或者我必須強制DOM更新?謝謝你的幫助。

+2

好吧,我剛剛發現這一點:http://stackoverflow.com/questions/34456430/ngfor-doesnt-update-data-with-pipe-in​​-angular2 我給它嘗試...在我讀了它之後.. – SoS

回答

2

根據Angular2管文檔:

角僅執行當檢測到純變化到輸入值的純管。純粹的變化是對原始輸入值(字符串,數字,布爾,符號)或已更改的對象引用(日期,數組,函數,對象)的更改。

Angular忽略(複合)對象內的更改。如果我們更改輸入月份,添加到輸入數組或更新輸入對象屬性,它將不會調用純管道。

原因

這看似嚴格,但也快。對象引用檢查速度快 - 比深入檢查差異要快 - 這樣Angular可以快速確定它是否可以跳過管道執行和視圖更新。

因此,當您更改數組或數組內的元素時,數組引用不會更改。

因此切換到.onPush或手動觸發更改檢測可能會解決您的問題。

來源:https://angular.io/docs/ts/latest/guide/pipes.html#!#pure-and-impure-pipes

+0

感謝您的鏈接。我現在改變了我的管道到'pure:false',它現在正在按預期工作。你能告訴我關於'.onPush'的更多細節嗎?它是什麼以及它放在哪裏?謝謝 – SoS

+0

@SoS你只需在'@ Component'註釋中加入'changeDetection:ChangeDetectionStrategy.OnPush'。它告訴角度來處理任何輸入,就好像它們是不可變的。如果你有興趣,網上有更詳細的信息。 – echonax

+0

使用changeDetection:ChangeDetectionStrategy.OnPush並手動觸發ChangeDetectorRef detectChanges()不適用於我 – teejay