0

我将映射插件与我自己的原型类型一起使用

来自 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());
}

怎么了?

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

http://jsfiddle.net/pDnnM/

Update2 在一些谷歌发现仍然没有骰子后测试了另一种方法:/

http://jsfiddle.net/5UDhB/

回答后更新

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

http://jsfiddle.net/699YH/

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

更新 CRUD 操作如何? 感谢 Stackoverflow 的 google 和 Madcapnmckay。我有最后一个问题,在此之后,我认为我可以使用我们目前正在使用手动映射器执行的映射插件来完成所有事情(我们很快就会达到 100 多个视图模型,因此手动映射器开始让我们感到沮丧)。

我还没有找到映射器处理 CRUD 场景的方法,假设加载视图时有 5 个项目,这些项目有 id,然后添加 2 个项目,这些项目 id:0。然后我们保存将整个 VM 发送到后端这些新行获得新的 ID。我在更新时调用了映射器插件,但它失败了When calling ko.update*, the key '0' was not unique!

http://jsfiddle.net/3bWcF/2/

你可以做

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

就在调用映射器之前,但是映射器可以为你做吗?谢谢!

4

1 回答 1

1

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

http://jsfiddle.net/madcapnmckay/3bWcF/1/

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));

希望这可以帮助。

于 2012-05-31T21:32:07.357 回答