【发布时间】:2016-01-11 13:49:51
【问题描述】:
我已经将两个独立的列表(请求和公司)捆绑到一个 JSON 对象中,并且我试图将它映射到 JavaScript 端的两个淘汰对象。
最初,我一次只传递一个列表(在 JSON 中没有数组名称)或映射函数中的包含行,它工作得很好。 一旦我将数组名称(例如“RequestList”=)添加到 JSON,它就停止工作。谢谢!
https://jsfiddle.net/yth4vx0z/1/
<table>
<tbody data-bind="foreach:requests">
<tr>
<td data-bind="text:RequestID"></td>
</tr>
</tbody>
</table>
<table>
<tbody data-bind="foreach:companies">
<tr>
<td data-bind="text:CompanyID"></td>
</tr>
</tbody>
</table>
以下是 JavaScript 代码:
var myViewModel;
$(function () {
myViewModel = new viewModel();
ko.applyBindings(myViewModel);
myViewModel.load();
});
var requestModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
}
var companyModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
}
var viewModel = function () {
var self = this;
self.requestMapping = {
include: ['RequestList'],
create: function (options) {
return new requestModel(options.data);
}
};
self.companyMapping = {
include: ['CompanyList'],
create: function (options) {
return new companyModel(options.data);
}
};
self.requests = ko.observableArray();
self.companies = ko.observableArray();
self.load = function () {
$.ajax(
{
json: ko.toJSON(fakeData)
success: function (data) {
ko.mapping.fromJS(data, self.requestMapping, self.requests);
ko.mapping.fromJS(data, self.companyMapping, self.companies);
},
error: function () {
}
});
}
}
var fakedata =
"RequestList": [
{
"RequestID": 12,
"ContactID": 29
}
],
"CompanyList": [
{
"CompanyID": 28,
"Name": "CoName"
},
{
"CompanyID": 29,
"Name": "Name"
}
]
【问题讨论】:
-
我发现的一种解决方法是将数据对象的子集简单地传递给映射函数:ko.mapping.fromJS(data["RequestList"], self.requestMapping, self.requests);
标签: javascript arrays json knockout.js