如何使用knockout mapping插件添加新的匿名项目

时间:2013-10-07 16:48:24

标签: jquery knockout.js knockout-mapping-plugin

当我尝试将新Item添加到我的数组中时,我似乎无法获取Knockout Mapping Plugin来执行“items”方法(Items)。 它似乎是在json的初始创建时执行,而不是在添加新项目时执行。

这是一个非常简化的jsFiddle

注意:我查看了similar questions,但它们都引用了我没有的静态对象。

初始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;
};

1 个答案:

答案 0 :(得分:2)

映射插件的目标(顾名思义)是在对象图之间映射而不是为拉伸创建新对象。所以它没有提供任何可以帮助你在这个用例中的功能...

但是,您的Items创建功能已处理空项目案例,因此您可以使用addItem方法直接调用此函数:

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

演示JSFIddle