各位好,
今天練習寫一個 one-way binding 時,發現一個奇怪的狀況:
如果變數是 Date 型態,html 上的值有時會 update,有時不會 update.
為了測試,我又加了一個 number 型態的變數,倒是沒這個問題。
先下個不負責任的結論:
有用 pipe 時,( {{ yyyymm | date: "yyyy/MM" }} ), 就不會 update;
沒用 pipe 時,如果同時有 count 就會 update;不然也不會 update.
是不是看不懂我在說什麼? 請看 這裡 ,畫面上只有2個按鈕,按按看就知道我的問題了。請大家幫忙解惑,謝謝!
這是 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 大師之路] 認識元件的變更偵測策略
可以參考文中 物件變數真正的變更
的部分。