iT邦幫忙

2

angular 疑問

  • 分享至 

  • xImage

各位好,

今天練習寫一個 one-way binding 時,發現一個奇怪的狀況:
如果變數是 Date 型態,html 上的值有時會 update,有時不會 update.
為了測試,我又加了一個 number 型態的變數,倒是沒這個問題。

先下個不負責任的結論:
有用 pipe 時,( {{ yyyymm | date: "yyyy/MM" }} ), 就不會 update;
沒用 pipe 時,如果同時有 count 就會 update;不然也不會 update.

是不是看不懂我在說什麼? 請看 這裡 ,畫面上只有2個按鈕,按按看就知道我的問題了。請大家幫忙解惑,謝謝!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
小碼農米爾
iT邦高手 1 級 ‧ 2019-03-19 14:28:30
最佳解答

這是 angular 變化檢測機制造成的現象
angular 會在程式結束後檢查所有綁定的變數有無變更,如果有才更新畫面

而 Date 不是 JS 的基本型別,所以在比較時會以物件的 參考 去比較
可以試試看比較 yyyymm 和 date
會發現結果都是 true

console.log(this.yyyymm === this.date);   //true

雖然 yyyymm 的月份有改變,但物件參考沒變,所以 angular 檢查不出變化,自然就不會更新畫面。

可以改成這樣試試

this.yyyymm = new Date(this.date);

而下半部的寫法因為有執行 toString() 所以比較的是字串
字串是 JS 的基本型別,是用 去比較
所以 angular 可以檢查出物件變化

[Angular 大師之路] 認識元件的變更偵測策略
可以參考文中 物件變數真正的變更 的部分。

Brandon iT邦新手 4 級 ‧ 2019-03-19 15:38:17 檢舉

說的非常詳細,感謝!

我要發表回答

立即登入回答