使用ko.mapping将我的observableArray填充到现有方法中

时间:2013-04-17 15:54:23

标签: knockout.js knockout-mapping-plugin

我有一个viewModel,它有这个observableArray

(function () {
    function myItems() {
        var self = this;
        self.itemArray = ko.observableArray();
        somefunction() {...
}
var myViewModel = new myItems();

此observableArray将包含以下实例:

(function () {
    function item() {
        var self = this;
        self.name = ko.observable("some data");
        self.doStuff = function () {
            return "doing whatever";
        };
    }
    window.item = item
}());

我将json映射到viewModel

var json = '{"name":"my main property", "itemArray": [ { "name": "Bob" }, { "name" : "Fred" } ] }';

var myViewModel = new myItems();
ko.mapping.fromJSON(state, {}, myViewModel);

如何告诉映射它必须使用item对象映射itemArray?如何在item()和myItems()之间创建链接?

这是一个显示问题的小提琴 http://jsfiddle.net/dexster/hLEMz/7/

2 个答案:

答案 0 :(得分:1)

解决方案是使用映射选项的创建回调

var mapping = {
    'itemArray': {
        create: function (options) {
            //add items to the items object here
            ...

答案 1 :(得分:0)

好吧,一旦你将它序列化为JSON来存储状态,你就会回到处理JSON数据之前的位置,以便首先填充你的视图模型。

实际上,这是你遇到的第一个问题,你正在序列化新的viewmodel,如果你在viewmodel上序列化itemArray,那么你将获得你开始使用的数据:

var unmapped = ko.mapping.toJSON(myViewModel1.itemArray);

然后,您可以将其传递给addItems方法:

myViewModel2.addItems(unmapped);

而不是映射它们。

这是更新后的jsFiddle