2

当我尝试将新项目添加到我的数组中时,我似乎无法让 Knockout 映射插件执行(项目的)“创建”方法。它似乎在从 json 初始创建时执行,而不是在添加新项目时执行。

这是一个非常简化的jsFiddle

注意:我看过类似的问题,但它们都引用了我没有的静态对象。

初始 JSON

var json = {    
  "Items": [{
        "ItemID": 1,
        "ItemDate": "2000-01-02T00:00:00Z",
        "Amount": 50
    },{
        "ItemID": 2,
        "ItemDate": "2000-01-02T00:00:00Z",
        "Amount": 100
    }]
};

映射选项

 var mappingOptions = {    
  "Items": {
    create: function (mappingoptions) {
        var data = mappingoptions.data;

        data = data || {
            "ItemID": ko.observable(0),                        
            "ItemDate": ko.observable(currentDate),                        
            "Amount": ko.observable(new Date())
        };

        var result = ko.mapping.fromJS(data);                                     
        return result;            
    }
  }
};

查看模型(使用添加方法)

MyApp.Batch.ViewModel = function (jsonBatch) {
  //Works Great
  var model = ko.mapping.fromJS(jsonBatch, mappingOptions); 

  //Doesn't Work
  model.addItem = function() {        
    // TRYING TO ADD a new Empty Item USING THE AUTO MAPPER        
    var newItem; 
    model.Items.push(ko.mapping.fromJS(newItem, mappingOptions))        
  };    

  return model;
};
4

1 回答 1

2

映射插件的目标(顾名思义)是在对象图之间进行映射,而不是为拉伸创建新对象。因此,它不提供任何可以在此用例中为您提供帮助的功能......

但是,您的Itemscreate 函数已经处理了空项目的情况,因此您可以在addItem方法中直接调用此函数:

model.addItem = function() {
    model.Items.push(mappingOptions.Items.create({}));
};  

演示JSFIddle

于 2013-10-07T18:57:02.623 回答