簡體   English   中英

異步 pipe 不更新視圖

[英]Async pipe not updating the view

復現

https://stackblitz.com/edit/angular-rlqkyb

應用服務

創建一個具有一些默認值的 BehaviorSubject 的簡單服務,一個 function 將此主題作為可觀察對象返回,最后一個 function 以發出關於該主題的新值。

應用組件

該組件僅獲取對服務返回的可觀察對象的引用,並通過異步 pipe 訂閱它。請注意,可觀察對象通過管道傳輸以顯示發出的值。

該組件還顯示第二個組件。

app2.component

該組件有一個輸入,該輸入訂閱由發出新值的服務返回的可觀察對象,僅此而已。

問題

問題是,即使我在控制台中看到了新值,app.component 的視圖也沒有更新。

起初,我認為這是因為服務返回的可觀察對象不在區域中,所以我嘗試將這個 function 的一部分包裝到zone.run中(可觀察對象的全部內容以及下一個/完整調用)但它仍然沒有用。

一件可行的事情是 app2.component 中的注釋行,它使用 setTimeout 訂閱可觀察對象。

另一件可行的事情是將更改檢測策略設置為默認而不是 OnPush,但是,我不希望這樣做。

在我看來,app.component 獲取可觀察對象,通過異步 pipe 訂閱它(因此它應該在收到新值后立即刷新值,這是可觀察對象的目標,向 Angular 表明某些內容已更改) . 同時,app2.component 被加載並通過其輸入更新可觀察對象,因此 app.component 的異步 pipe 應該獲取新值並更新其視圖,就像它在沒有 OnPush 策略的情況下所做的那樣。

我非常有信心這不是 angular 問題,而是我的誤解,但如果有人能解釋我錯在哪里,我將不勝感激:-)

請注意,我還檢查了 StackOverflow 上的其他線程,但他們都在談論zone.run或使用detectChanges (我不知道在哪里使用它)

從 observable 發出一個新值標志着 OnPush 組件在下一個變化檢測周期中被檢查。 但我認為在您的情況下,根本沒有發生任何事情會觸發應用程序中的 CD 循環。 這解釋了為什么帶有 setTimeout 的行修復它: setTimeout 觸發 CD 循環,並且因為組件被標記為要檢查,所以它被更新。

添加.slice() ,angular 會刷新。

let objects = this.state.objects.slice();
this.state = {...this.state, objects};

暫無
暫無

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

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