Ode*_*den 2 javascript knockout-mapping-plugin knockout-2.0 knockout.js
我想将这个json映射到自定义对象.问题是项目不是Itemof对象而是普通对象.我在这里缺少什么?
你可以在这里测试:http://jsfiddle.net/5jhpE/
var json = [
{
id: 1,
items: [
{id: 1, name: 'item1'},
{id: 2, name: 'item2'},
{id: 3, name: 'item3'}
]
},
{
id: 2,
items: [
{id: 4, name: 'item4'},
{id: 5, name: 'item5'},
{id: 6, name: 'item6'}
]
},
]
function Data(data) {
ko.mapping.fromJS(data, {}, this);
}
function Item(data) {
ko.mapping.fromJS(data, {}, this);
}
var map = {
create: function(options) {
return new Data(options.data);
},
items: function(options) {
return new Item(options.data);
},
}
var res = ko.mapping.fromJS(json, map);
Run Code Online (Sandbox Code Playgroud)
输出:
console.log(res());
[Data, Data]
--
console.log(res()[0].items());
[Object, Object, Object] <-- Here I want to have [Item, Item, Item]
Run Code Online (Sandbox Code Playgroud)
我已经用这种方式改变了你的mapper选项
var map = {
'items': {
create: function(options) {
return new Item(options.data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
看起来很好; 你能试试吗?
如果你需要:jsfiddle 控制台输出是[Item,Item,Item]你想要的;
我允许添加一个小建议:如果你需要以这种方式测试typeof:
typeof res()[0].items()[0]
Run Code Online (Sandbox Code Playgroud)
注意,这可能很棘手!
为了避免任何问题,我通常以这种方式声明Item viewModel:
function Item(data) {
var self = this;
self.myType = 'item';
ko.mapping.fromJS(data, {}, this);
}
Run Code Online (Sandbox Code Playgroud)
所以你可以简单地测试,例如:
if('item' === res()[0].items()[0].myType) {
//do something...
}
Run Code Online (Sandbox Code Playgroud)
这个"myType"技巧是在一段时间之前在stackoverflow中提出的:我会在这里发布链接,我会很快找到帖子
| 归档时间: |
|
| 查看次数: |
4988 次 |
| 最近记录: |