Knockout.js 新行未使用映射插件正确映射

Knockout.js 新行未使用映射插件正确映射,knockout.js,Knockout.js,我将映射插件用于我自己的原型类型 来自JSON var mapping = { Children: { create: function(options) { return ko.mapping.fromJS(options.data, {}, new ChildViewModel()); } } }; $.getJSON(url, null, function (data) { var model = ko.ma

我将映射插件用于我自己的原型类型

来自JSON

var mapping = {
    Children: {
        create: function(options) {
            return ko.mapping.fromJS(options.data, {}, new ChildViewModel());
        }
    }
};

$.getJSON(url, null, function (data) {
    var model = ko.mapping.fromJS(data, mapping, new RootViewModel());
    ko.applyBindings(model);
});
到JSON

var data = ko.mapping.toJSON(this);
json数据具有原始子项,新添加的项只是空的json对象
{}

我从根模型中添加这样的子项

addChild: function () {
    this.Children.push(new ChildViewModel());
}
怎么了

更新: 使我的问题重现的小提琴

更新2 在谷歌的一些发现仍然没有成功后,测试了另一种方法:/

回答后更新

我有关于主模型和子模型的数据,需要映射,然后序列化为JSON

所以我需要它来映射主模型和子模型,也许这是不可能的

如何更新CRUD操作? 我还要感谢Stackoverflow的google和Madcapnmckay。我还有最后一个问题,在这之后,我想我可以用映射插件做所有的事情,我们目前正在使用我们的手动映射器(我们很快就会碰到100多个视图模型,所以手动映射器开始让我们感到沮丧)

我还没有找到映射程序处理CRUD场景的方法,假设加载视图时有5个项目,这些项目有id,然后添加2个项目,这些项目获得id:0。然后我们保存并发送整个VM到后端,这些新行获得新Id。我在更新时调用了mapper插件,但调用ko.update*时,
失败,键“0”不是唯一的

你当然可以

this.items.remove(function(item) { return item.id() == 0;});

就在打电话给制图员之前,制图员能帮你吗?谢谢

问题在于动态添加的子项不是由映射插件创建的。您可以解决这个问题,并通过像这样在对象内部移动映射来清理代码


希望这能有所帮助。

谢谢,伙计,我昨晚自己发现了:D,但将标记为答案,这也是使用映射插件的一种干净方法。我已经更新了我的问题,也许你可以解释一下,获得额外的分数:D
var mappings = {
    items: {
        key: function(data) {
            return data.id;
        },
        create: function(options) {
            return new ChildViewModel(options.data)
        }
    }
};    

var counter = 5;

ViewModel = function(config) {
    ko.mapping.fromJS(config, mappings, this);   

    this.json = ko.computed(function() {
        return ko.mapping.toJSON(this, { ignore: [ "json" ] });
    }, this);
};

ViewModel.prototype = {
    add: function() {
        this.items.push(new ChildViewModel({ 
            id: counter++, 
            name: "new row" + counter 
        }));
    }
};

ChildViewModel = function(config) {
    ko.mapping.fromJS(config, {}, this);
};

ko.applyBindings(new ViewModel(data));