Javascript 使用敲除映射插件正确映射数组元素

Javascript 使用敲除映射插件正确映射数组元素,javascript,knockout.js,knockout-mapping-plugin,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,

我有一个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
数组中的最后一个元素作为空对象(
{}
)。另外两个物体看起来和我想要的一样

我想我知道为什么。第一个对象的
\uuuu ko\u mapping\uuu.mappedProperties
包含了它们最初映射时拥有的所有属性。但是,最后一个属性有一个空的
\uu ko\u mapping\uu.mappedProperties
,因此我猜没有属性被映射回

所以我想我需要做一件事:

  • addObjectMember
    上将对象添加到数组时,我需要获取
    的映射属性集,以便在保存时将其映射回
  • 当映射回时,我将包括映射对象上的所有属性,而不管它们是否存在于
    \uuuko\u mapping.mappedProperties

  • 我不知道如何做这些不觉得是肮脏的黑客,所以这里的任何帮助都将不胜感激。

    我最终使用了
    ko.toJS
    而不是
    ko.mapping.toJS
    ko.toJS
    不关心
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu映射
    ,映射所有内容(包括
    \uuuuuuuuuuuuuuuuuuuuuuuuu


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

    似乎
    ko.toJS
    不关心最初映射的内容。将它组合起来是否有任何问题,以便我使用
    ko.mapping.fromJS
    创建模型,然后使用
    ko.toJS
    将其重新转换为javascript?