使用Knockout映射插件正确映射数组元素

时间:2014-02-07 12:36:59

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

我有一个viewModel,在简化时看起来像这样:

var viewModel = function(){
  var self = this;
  self.selectedObject = ko.observable({});
  self.getUnit = function(){
    //get the selected object from the server side as json
    self.selectedObject(ko.mapping.fromJS(data,mapping));
  };
  self.addObjectMember = function(){
    self.selectedObject().objectMembers.push(new ObjectMemberViewModel(null, self.selectedObject()));
  self.save = function(){
    var data = ko.mapping.toJS(self.selectedObject);
    //ship data to server
  }

从服务器收到的数据包含一个名为objectMembers的数组,其中包含一些属性。不同对象之间的属性可能不同。

我的映射对象如下所示:

var mapping = {
  'objectMembers': {
    create: function(options){
      return new ObjectMemberViewModel(options.data, options.parent);
    }
  }
};

要查看我的问题,我会举个例子:

用户加载页面,然后提取对象。该对象包含objectMembers数组中的两个元素。然后使用ko.mapping.fromJS映射这些,一切正常。我可以使用我的模型修改我的viewModel并更新viewModel。然后用户单击触发addObjectMember函数的按钮,向observableArray添加第三个条目。我也可以与此进行交互,并且可以在viewModel中按预期看到对我的模型所做的任何更改。

单击“保存”时出现问题。如果我调试save方法,并检查self.selectedObject的内容,我可以看到它包含我想要的内容,但映射回变量data的对象具有objectsMembers中的最后一个元素{1}}数组作为空对象({})。另外两个对象看起来像我想要的那样。

我想我知道为什么。第一个对象的__ko_mapping__.mappedProperties包含了最初映射时所具有的所有属性。但是最后一个有一个空__ko_mapping__.mappedProperties,因此我猜没有映射回属性。

所以我想做其中一件事我想:

  1. 将对象添加到addObjectMember上的数组时,我需要设置__ko_mapping__.mappedProperties,以便在保存时将其映射回来。
  2. 回映时,我会在映射对象中包含所有属性,而不管它们是否存在于__ko_mapping__.mappedProperties内。
  3. 我不知道如何做任何不像脏兮兮的黑客,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我最终使用的是ko.toJS而不是ko.mapping.toJSko.toJS不关心__ko_mapping__,并映射所有内容(包括__ko_mapping__)。

这意味着它的映射比我需要的多一点,但除此之外它工作正常。