根据我的真实项目使用以下测试代码:

var test = ko.mapping.fromJS({ id: 1, kids: [{ name: "sue"}] });
test.kids.push({ name: "tim" });
test.kids.push(ko.mapping.fromJS({ name: "joe" }));
console.log(test);
console.log(test.kids()[0]);
console.log(test.kids()[1]);
console.log(test.kids()[2]);
test.kids()[2].__ko_mapping__ = undefined;
console.log(test.kids()[2]);

Firebug中的控制台输出显示:

Object { __ko-mapping__={...}, id=d(), kids=d() }
Object { name=d() }
Object { name="tim" }
Object { __ko-mapping__={...}, name=d() }
Object { name=d() }

我的目标是在数据初始映射后将项目添加到kids数组中,并使这些项目看起来与添加的原始项目相同。 如果我只是将一个对象直接推到数组上,则该属性是不可观察的。 如果我使用ko.mapping.fromJS推送对象, ko.mapping.fromJS获得一个额外的__ko_mapping__对象。 我宁愿没有多余的对象,因为它似乎不是必需的(原始项目没有它并且可以正常工作),并且我可能在以后要添加数千个项目的地方使用相同的设计。

将对象设置为undefined似乎会删除多余的对象,但如果可能的话,最好不要首先创建它。

===============>>#1 票数:1 已采纳

基于没有其他答案,唯一的答案可能是更好的设计实践,但实际上却与我要求的相反(它向每个孩子添加了一个映射对象)。我想我已经有了答案在我最初的问题中,只是假设必须有更好的方法。

因此,对于未来的读者来说,这里是:

test.kids()[2].__ko_mapping__ = undefined;

如果要删除它,只需将ko_mapping设置为undefined即可。

有关为什么这不是一个好主意,请参阅评论和其他答案。 对于我的需求,也许您也有同样的想法,这是一个好主意。

===============>>#2 票数:0

通常,我发现为“孩子”创建一个强大的原型并告诉映射插件在映射初始数据时使用它很有用。 这将导致数组的内容相同,并具有允许每个孩子进行计算和观察的额外好处。

http://jsfiddle.net/Z9GF5/

var Kid = function(json){
    ko.mapping.fromJS(json, {}, this);
}

var mapping = {
    'kids': {
        create: function(options) {
            return new Kid(options.data);
        }
    }
}

现在,如果您必须添加项目,只需创建新的Kids。

var test = ko.mapping.fromJS({ id: 1, kids: [{ name: "sue"}] }, mapping);
test.kids.push(new Kid({ name: "tim" }));
test.kids.push(new Kid({ name: "joe" }));
console.log(test);
console.log(test.kids()[0]);
console.log(test.kids()[1]);
console.log(test.kids()[2]);

然后,Firebug显示:

Object {id: function, kids: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}
Kid {name: function, __ko_mapping__: Object}

===============>>#3 票数:0

http://knockoutjs.com/documentation/plugins-mapping.html

您可以选择映射哪些属性以及如何映射。

  ask by eselk translate from so

未解决问题?本站智能推荐:

2回复

将新项目添加到使用ko.mapping插件为Knockout.js创建的列表中

我正在尝试找出将元素添加到使用ko.mapping创建的模型中的列表的规范方法。 我创建了一个jsFiddle来修补 : javascript遵循以下内容: 相应的HTML 在jsFiddle上 。 当我使用append_outer我希望将一个新元素添加到view_mode
2回复

Knockout.js映射JSON对象-仅第一个数组

这是我从服务中收到的JSON,它将包含“第一个”数组和一个ResponseStatus数组。 并且第一个JSON Array与ko.mapping映射 它工作正常。 但这是 问题 :我不能使用“ data.Customers”,因为服务器也可以在第一个位置返回“ Comp
2回复

如何添加到现有的Knockout JS映射对象?

我有一个来自api的JSON数据,如下所示: 稍后当我从buttonClick获取数据时,我想添加到我的JSON中。 当我逐步执行代码时,它会将值添加到dataTotal,但数据不可观察,因此我的视图不会更新。 请帮助谢谢
1回复

Knockout.js映射:在树中添加可观察对象

我正在使用基因敲除可视化一棵树。 我有一个初始的AJAX调用来加载孔树。 使用敲除映射插件进行映射。 一切正常:)感谢这款出色的软件。 我的问题是:我想向模型添加其他可观察对象。 我可以使用映射选项来做到这一点。 宾语: 映射选项: 对应: 响应是对象
1回复

Knockout.js映射忽略

我们正在使用.NET MVC 4上的knockout.js和knockout.mapping.js。假设我有这样的JSON: 在表单提交失败(如果出现问题/服务无效)时,它将重新填充先前的值。 我们将表单提交时的ViewModel转换为JSON,使用$('#BuildingsJSON'
1回复

使用Knockout JS映射选项将Observable属性添加到映射的Observable数组

我使用Knockout可观察数组( self.data )在视图中绑定表,该数组由AJAX调用和Knockout Mapping插件填充。 目的是使ViewModel作为可重用组件。 我需要添加一列以选择表行。 我想通过使用映射选项将boolean isSelected observa
1回复

如何在Knockout.js中附加到映射的可观察数组?

如何在Knockout.js中的可编辑表中添加行? 该表显示self.List()是映射到data.Lines与self.List(ko.mapping.fromJS(data.Lines)()) 当我单击addRow按钮时,我想我需要重新计算self.List() 。 我已经
1回复

Knockout.js映射插件不会在对象中调用数组的“创建”或“更新”属性

如果数组嵌套在对象中,则在需要时不会调用Knockout.js映射插件的'create'和'update'回调。 特别是,人们希望调用view_model.mappedCreate({})会触发回调。 这是一个示例,给出了这样的数据结构和映射: 从该jsFiddle中可以看到,上
1回复

Knockout.js映射未显示绑定在子ObservableArray上的数据

我在已定义对象上有一个可观察的子数组。 当返回服务器中的对象并将其填充到可观察到的分离中时,数据将无法显示。 但是,可以通过调试验证视图模型中的数据。 我创建了jsFiddle来说明问题。 http://jsfiddle.net/CraigHead/Y2Fr6/ 我的视图模型就
1回复

如何使用knockout映射添加到可观察数组

我正在尝试将一个json项添加到一个可观察的数组中,并在foreach渲染中显示它。 但是当我尝试使用item.property()语法访问该项时,它会失败但仅适用于初始绑定后项。 用代码更好地解释...... JS: 输出:(注意,“红色”不吐出:/) 演示: htt