復制品
https://stackblitz.com/edit/angular-rlqkyb
應用程式服務
簡單的服務創建一個帶有一些默認值的 BehaviorSubject,一個將該主題作為可觀察物件回傳的函式,最后是一個在該主題上發出一個新值的函式。
應用程式組件
該組件只是獲取對服務回傳的可觀察物件的參考,并通過異步管道訂閱它。請注意,通過管道傳輸 observable 以顯示發出的值。
該組件還顯示第二個組件。
app2.component
該組件有一個輸入訂閱了服務回傳的可觀察物件,該服務發出一個新值,僅此而已。
問題
問題是即使我看到控制臺中發出的新值,app.component 的視圖也沒有更新。
起初,我以為是因為服務回傳的 observable 不在 zone 中,所以我嘗試將這個函式的某些部分包裝成一個zone.run(observable 的全部內容和只是 next/complete 呼叫)但它仍然沒用。
有效的一件事是 app2.component 中的注釋行,它使用 setTimeout 訂閱 observable。
另一個可行的方法是將更改檢測策略設定為默認而不是 OnPush,但是,我不希望這樣做。
在我看來,app.component 獲取 observable,通過異步管道訂閱它(因此它應該在收到新值后立即重繪 值,這是 observable 的目標,向 Angular 表明某些事情發生了變化) . 同時,app2.component 被加載,并通過其輸入更新 observable,因此 app.component 的異步管道應該獲取新值并更新其視圖,因為它在沒有 OnPush 策略的情況下執行此操作。
我很有信心這不是角度問題,而是我的誤解,但是如果有人能解釋我哪里錯了,我將不勝感激:-)
請注意,我還檢查了 StackOverflow 上的另一個執行緒,但他們都在談論zone.run或使用detectChanges(我不知道在哪里使用它)
uj5u.com熱心網友回復:
從 observable 發出一個新值標志著 OnPush 組件在下一個變化檢測周期中被檢查。但我認為在您的情況下,根本沒有發生任何事情會觸發應用程式中的 CD 回圈。這就解釋了為什么帶有 setTimeout 的行會修復它: setTimeout 觸發 CD 回圈,并且因為組件被標記為要檢查,所以它被更新。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491839.html
上一篇:RXJS:按順序進行多個訂閱
