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的回答解决了我问题的关键。