使用这个测试代码,基于我的真实项目:
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__
对象。我宁愿没有额外的对象,因为它似乎不需要(原始项目没有它并且工作正常),并且我可能会在稍后添加 1000 个项目的地方使用相同的设计。
将对象设置为undefined
确实似乎删除了额外的对象,但如果可能的话,宁愿不首先创建它。