2012-11-09 57 views
1

如果數組嵌套在對象中,則Knockout.js映射插件的'create'和'update'回調函數不會被調用當人們所期望的時候。特別是,預計撥打view_model.mappedCreate({})會觸發回調。Knockout.js映射插件不會調用對象中數組的「創建」或「更新」屬性

下面是一個例子,給定的數據結構和映射是這樣的:

var data = { 
    Test: { 
     Items: [ 
      { Name: "Red", Count: 0}, 
      { Name: "Green"} 
     ] 
    }, 
    NewItem: "" 
}, 
    counter = 0; 


var vm = ko.mapping.fromJS(data, { 
    Test: { 
     Items: { 
      create: function(options) { 
       options.data.Count = ++counter; 
       console.log("Data:", options.data); 
       return ko.mapping.fromJS(options.data); 
      }, 
      update: function(options) { 
       options.data.Count = ++counter; 
       console.log("Data:", options.data); 
       return ko.mapping.fromJS(options.data); 
      } 
     } 
    } 
}); 

正如從this jsFiddle看到,上述的輸出是:

{ 
    "Test": { 
    "Items": [ 
     { 
     "Name": "Red", 
     "Count": 0 
     }, 
     { 
     "Name": "Green" 
     } 
    ] 
    }, 
    "NewItem": "" 
} 

此外,console.log聲明永遠不會被調用。

可以預期Items的第二個元素爲{"Name": "Green", "Count": 1 }(和要執行的console.log語句)。

Items沒有嵌套時,它按預期工作 - 如您在this jsFiddle中看到的那樣。

有可能我忽略了一些明顯的東西,但無論如何我都會對如何解決此問題的見解和建議表示感謝。

回答

1

答案似乎已經使數組名的映射頂層,是這樣的:

var vm = ko.mapping.fromJS(data, { 
     Items: { 
      create: function(options) { 
       options.data.Count = ++counter; 
       console.log("Create:", options.data); 
       return ko.mapping.fromJS(options.data); 
      }, 
      update: function(options) { 
       options.data.Count = ++counter; 
       console.log("Update:", options.data); 
       return ko.mapping.fromJS(options.data); 
      } 
     } 
}); 

this jsFiddle

我在其他地方的代碼中仍然遇到問題,但顯然上面說明的問題不是它。

相關問題