Angular2 模型渲染的一個坑

今天在使用angular2開發一個CMS項目的時候發現了一個模型渲染的坑,特此記錄。

相信很多人使用angular2的時候都有這麼一種情況,首先定義一個單例service,作爲數據的提供者,在組件中注入,service中只簡單的返回一個數組對象。例如:
這裏寫圖片描述

在組件中定義一個私有變量,等於例如圖中的columns(圖中是我更改以後的代碼,原本就是定義了一個私有變量,等於了對象中的columns數組,然後在HTML中Ngfor循環顯示):
這裏寫圖片描述

運行,一切正常,view中也能正確渲染,但是如果這時候你從另一個組件中使用一個新的數組直接替換了service中的columns數組,按理說view中應該是渲染出新的結果,但是結果是view沒有任何變化。到底爲什麼是這樣呢?按理說js的數組傳遞應該是按引用傳遞,傳遞順序應該是這樣(圖中的紅線代表新賦值後的引用,每一個方塊理解爲一個內存塊):
這裏寫圖片描述

但是你如果log出兩個不同引用的值,會發現,其實並不是這樣的。按照我搜索的資料,實際引用關係是這樣:
這裏寫圖片描述
也就是說,當你賦值數組的時候,a=[1,2,3]; a=b; a=[2,3,4],b其實是接收了一份a指向數組內存地址的copy,也就是b存的是[1,2,3]的內存地址,那麼當你將a指向另一個數組地址時,b其實根本沒有改變。

那麼怎麼去解決這個問題呢?有兩種解決方案:

  1. 像我之前的圖一樣,直接傳遞對象的引用過去,然後在view中去對象中的對應屬性(這也是angular推薦的做法,無論是1還是2,都推薦將需要綁定的值使用對象,而不是直接使用一個字符串之類的)。
  2. 改變數組的時候不要使用賦值,而是使用例如JS Array slice等方法,直接改變原地址上的數組(這種情況非常麻煩)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章