Knockout.js 使用敲除映射,我自己如何映射整个数组属性?

Knockout.js 使用敲除映射,我自己如何映射整个数组属性?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,从我的服务器接收到一个类似以下内容的对象: var fromServer = { foo: "Some foo", barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] }; viewModel: { foo: "Some foo", barArray: [ ["bar1", "bar2"], ["bar3", "bar4"], ["bar5"] ] } 使用用于knockout的映射插件,我想定制视图

从我的服务器接收到一个类似以下内容的对象:

var fromServer = { 
    foo: "Some foo", 
    barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] 
};
viewModel: {
    foo: "Some foo",
    barArray: [ ["bar1", "bar2"], ["bar3", "bar4"], ["bar5"] ]
}
使用用于knockout的映射插件,我想定制视图模型的构造方式,并将数组分解为长度为2的子数组。大概是这样的:

var fromServer = { 
    foo: "Some foo", 
    barArray: [ "bar1", "bar2", "bar3", "bar4", "bar5" ] 
};
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>

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

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

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

parent
:此子对象所属的父对象或数组


因此,您可以使用
选项访问它

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

可以按照创建视图模型之前使用的方式重新构造传入阵列。 您不必使用以某种方式“语义分组”的数据数组,而可以将其转换为 属性相应填充的对象数组

我假设您的数据在某种程度上与工作日相关,所以我创建了WeekViewModel,它将保存每个工作日的数据。在将数据映射到viewmodel之前,我使用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);

这里有一把小提琴:

你为什么要把它们分成两个数组?@PaulManzotti这显然不是真正的问题。事实上,我得到了一个包含一个月内所有天数的数组,每天都会附加一些数据,我需要将该数组分解为7天的子数组,这样我就可以使用模板一次渲染日历。是的,我知道这一点,但即使如此,数组中的每个元素都会执行一次回调,这是不可取的。我想访问整个阵列,一次。Rustam,谢谢你的回答,这绝对是有帮助的!然而,我认为@PabloRodríguez的回答解决了我问题的关键。