【问题标题】:Correctly mapping array element using the Knockout mapping plugin使用 Knockout 映射插件正确映射数组元素
【发布时间】:2014-03-04 21:05:36
【问题描述】:

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

我想我知道为什么。前两个对象的__ko_mapping__.mappedProperties 包含它们最初映射时的所有属性。然而,最后一个有一个空的__ko_mapping__.mappedProperties,因此我猜想没有属性被映射回来。

所以我猜我需要做以下事情之一:

  1. 将对象添加到 addObjectMember 上的数组时,我需要设置 __ko_mapping__.mappedProperties 以便在保存时映射回来。
  2. 映射回时,我将映射对象上的所有属性都包含在内,无论它们是否存在于__ko_mapping__.mappedProperties 中。

我不知道如何做任何看起来不像是肮脏的黑客攻击,所以这里的任何帮助都将不胜感激。

【问题讨论】:

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

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


【解决方案1】:

我最终使用ko.toJS 而不是ko.mapping.toJSko.toJS 不关心__ko_mapping__,映射一切(包括__ko_mapping__)。

这意味着它比我需要的更多,但除此之外它工作得很好。

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2012-12-18
    • 2012-02-08
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多