0

从我的服务器我收到一个看起来像这样的对象:

var fromServer = { 
    foo: "Some foo", 
    barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] 
};

使用映射插件进行淘汰赛,我想自定义视图模型的构建方式并将数组分解为长度为 2 的子数组。像这样:

viewModel: {
    foo: "Some foo",
    barArray: [ ["bar1", "bar2"], ["bar3", "bar4"], ["bar5"] ]
}

在去那里的路上,我意识到create每个数组项都会调用一次回调。这是我的看法:

<h1 data-bind="text: foo"></h1>
<ul data-bind="foreach: barArray">
    <li data-bind="text: $data.name"></li>
</ul>

和javascript:

var fromServer = { foo: "Some foo", barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] };

var mapping = {
    'barArray': { 
        create: function(options) {
            return new barModel("This is " + options.data);
        }
    }
};

var barModel = function(data) {
   this.name = data; 
};

var viewModel = ko.mapping.fromJS(fromServer, mapping);

ko.applyBindings(viewModel);

这是一个显示行为的小提琴

这是真正的问题:使用create回调,我可以一次访问整个数组,而不是每个元素吗?或者,我是否以错误的方式处理这个问题?

4

3 回答 3

1

您需要这样做,以便从 JSON 的根目录映射对象

        var mapping = {
            '': { 
                create: function(options) {
                    return new .....
                }
            }
        };
于 2013-02-22T16:03:21.003 回答
0

查看文档,传递给 create 方法的 options 参数有两个属性:

data: 包含此孩子数据的 JavaScript 对象

parent: 这个孩子所属的父对象或数组

因此您可以使用options.parent.

于 2013-02-22T15:15:05.607 回答
0

您可以在创建视图模型之前以使用它的方式重组传入数组。您可以将其转换为具有相应填充属性的对象数组,而不是使用以某种方式“按顺序分组”的数据数组。

我假设您的数据与工作日有某种关联,所以我创建了 WeekViewModel 来保存每个工作日的数据。在将数据映射到视图模型之前,我使用 ProcessBeforeCreatingViewModel 函数处理 if:

function WeekViewModel(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, self);
}

function ProcessBeforeCreatingViewModel(data) {

 var tempObj = null;

 var data_processed = {
    foo: data ? data.foo : '',
    barArray: []
 };

 if (data && data.barArray) {

    data.barArray.forEach(function (barItem, index) {

        if (index % days.length == 0) {
            tempObj = {};
            days.forEach(function (dayName) {
                tempObj[dayName] = undefined;
            });
            data_processed.barArray.push(tempObj);
        }

        tempObj[days[index]] = barItem;
    });
 }

 return data_processed;
}


var mapping = {
    'barArray': { 
        'create': function(options) {
            return new WeekViewModel(options.data);
        }
    }
};

var fromServer_Processed = ProcessBeforeCreatingViewModel(fromServer);

var viewModel = ko.mapping.fromJS(fromServer_Processed, mapping);

ko.applyBindings(viewModel);

这是一个小提琴:http: //jsfiddle.net/JeJKP/

于 2013-02-22T19:09:24.040 回答