2012-04-16 20 views
2

我最近注意到使用KO映射插件更新頁面上的數據時,將來的事,一對夫婦。首先我認爲是現在固定在2.1.1下面所示的第二個仍然存在:Knockout貼圖插件或我的代碼中的數組錯誤?

我有一個簡單的模型。問題在於它包含的地址數組。看起來,當我使用映射插件時,它實際上只有一個跟蹤數組中的2個元素。我不確定如果這是一個問題瓦特/我的代碼或映射插件。請考慮以下簡單示例:

//Retrieved thru AJAX 
var serverData = { name: "Bob", Addresses: [{ AddressLine: "", City: "", PostalCode: "", StateID: 10}] }; 

    load(serverData); 
    //Seems OK at this point 
    //this.vm.__ko_mapping__.mappedProperties shows properties for Addresses[0] & name which makes sense 


    //Now some time goes by and we want to update the bound VM w/ new data from the server 
    load(serverData); 

    //Problem! 
    //this.vm.__ko_mapping__.mappedProperties shows properties for Addresses[0] & Addresses[1] 
    //But there is no Addresses[1]!! 

    //Lets simulate an update of data (1 more time) 
    load(serverData); 
    //Interestingly it doesn't get any worse, still just Addresses[0] & Addresses[1] 

    function load(d) 
    { 
     if (this.vm) //Refresh existing VM 
     { 
      ko.mapping.fromJS(serverData, vm); 
     } 
     else //On 1st Load have mapping create the VM and bind it 
     { 
      this.vm = ko.mapping.fromJS(serverData); //Mapping creates object from server data 
      ko.applyBindings(this.vm, $("body")[0]); 
     } 
    } 
+0

你能複製你這個小提琴的問題?我從來沒有看到多個地址。 http://jsfiddle.net/jearles/xTHFg/2/ – 2012-04-17 00:12:49

+0

好吧......我明白你的意思。雖然沒有第二個地址出現在視圖模型中,但我確實在mappedProperties中看到了兩個條目。 – 2012-04-17 00:37:35

+0

是的,正好。在2.1.0版本中,相同的代碼在每次更新時還會繼續增加include []並增加「_destroy」條目。這似乎現在已經被修復了,但由於我的場景中更新的頻率,我對內存泄漏感到緊張。 – 2012-04-17 09:11:10

回答

2

映射插件允許定義返回數組中元素的鍵的回調。 (請參見http://knockoutjs.com/documentation/plugins-mapping.html上的「使用鍵唯一標識對象」)。這用於確定對象是新的還是舊的。有三種可能的狀態:一個新的對象被加入到陣列中,已經存在的元件陣列中保留(但被更新)或現有元素獲得除去從陣列,因爲它不再出現在新的數據集。 (這些狀態實際上由效用函數ko.utils.compareArrays確定)

這裏的正確狀態是「保留」,但由於您沒有爲數組中的地址提供唯一鍵,因此映射插件具有不知道那些條目實際上是相同的 - 因此國家「刪除」被轉讓給本目標和國家「添加」到新的一個。

這導致與需要注意的所有元素的列表 - 本一個具有「0」鍵,新的一個鍵「1」,因此,在「mappedProperties」怪異的條目。我認爲這可以被認爲是一個錯誤,但這是一個非常棘手的問題。並且它不是真正的內存泄漏,因爲ghost條目的數量始終爲numPreviousEntries

下面是一個小提琴證明,使用獨特的鍵(可以是任何東西,如果你有不超過一個排,所以我用的狀態ID)確實可以解決此問題:http://jsfiddle.net/xTHFg/4/