使用不同的JSON密钥进行Knockout映射

时间:2015-07-28 11:18:12

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

这是(我相信)一个简单问题的简单问题,但解释起来有点棘手......

我已经淘汰成功绑定到DOM,但是我在从Ajax请求更新Javascript视图模型时遇到了困难。

问题是收到的JSON中的名称与视图模型中的属性不匹配。

查看模型

var Group = function (data) {
    this.id = data.id;
    // Notice the Group 'name' is different to the JSON data 'title'
    this.name = ko.observable(data.title);
};

var GroupList = function (data) {
    this.groups = ko.observableArray();

    ko.mapping.fromJS(data, {
        groups: {
            key: function (groupData) {
                return ko.utils.unwrapObservable(groupData.id);
            },
            create: function (options) {
                return new Group(options.data);
            }
        }
    }, this);
};

初始JSON&设置

var json = {
    groups : [ {
            id : 1,
            title : 'Engineers'
        }, {
            id : 2,
            title : 'Sales'
        }
    ]
};

var viewModel = new GroupList(json);
ko.applyBindings(viewModel);

一段时间后(Ajax的结果)数据更新......

var updatedJson = {
   groups : [ {
            id : 1,
            title : 'Engineers 2'
        }, {
            id : 2,
            title : 'Sales 2'
        }
    ]
};

ko.mapping.fromJS(updatedJson, {}, viewModel);

这个JSFiddle完全显示了问题:http://jsfiddle.net/1gp3fp80/3/

最初创建视图模型时,它正确"映射"由于行title

,JSON name到了组实例this.name = ko.observable(data.title);属性

当视图模型更新时,ko.mapping.fromJS(updatedJson, {}, viewModel); Group最终会显示包含原始值的name属性,以及新的title已使用新值创建的属性。

我已多次阅读knockout mapping documentation但无法弄清楚该怎么做(我对现代网络开发不熟悉)。

最终问题很简单:是否可以将knockout映射插件配置为从一个JSON名称映射到视图模型中的其他名称,如果是这样,您是如何做到的?希望答案同样简单......

0 个答案:

没有答案