我正在尝试使用敲除映射插件将对象数组映射到observableArray。不知怎么的,这似乎对我根本不起作用。
我刚刚用Crome控制台进行了测试以验证:
ko.mapping.fromJS( [ { x: 1, y: "test" } ] )
returns:
[]
我做错了什么?如果我尝试以下
ko.mapping.fromJS( [ { x:1, y: "test" } ][0] )
returns an object containing x and y as observables...
一切都很好。唯一的区别是我只传递一个对象,而不是一个对象数组。但是,如果我正确阅读了映射插件的文档,它应该能够处理从普通数组创建observableArray的问题。
感谢您的帮助,
Andreas
这是应该做的(至少在理论/文档中),但显然不是它正在做的。我也有同样的问题,我也相信其他问题:https://groups.google.com/forum/?fromgroups=#!主题/敲除js/uKY84iZaxcs
对象必须是:
{ "someName" : [ { x: 1, y: "test" } ] }
为了坚持您的对象模式,您可以使用ko.utils.arrayMap将对象映射到您的ko ViewModel:http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html
function Item(name, category, price) {
this.name = ko.observable(name);
this.category = ko.observable(category);
this.price = ko.observable(price);
this.priceWithTax = ko.dependentObservable(function() {
return (this.price() * 1.05).toFixed(2);
}, this);
}
//do some basic mapping (without mapping plugin)
var mappedData = ko.utils.arrayMap(dataFromServer, function(item) {
return new Item(item.name, item.category, item.price);
});
编辑
我对此做了更多的研究,你实际上可以用KO映射来映射JS数组对象,然而,映射后的对象不会是KO Observable array。它将只是一个普通的JS数组对象,因此,您可以使用KO:进行数据绑定
var bd = [ { x: 1, y: "bd test" }, { x: 2, y: "bd test 1dsf" } ];
var bdViewModel = ko.mapping.fromJS(bd);
// 'bdViewModel' is NOT KO Observable Array, so you can't use KO Binding. However, all the properties of 'bdViewModel' (x and y) are KO Observable.
//ko.applyBindings(bdViewModel, $("#bd").get(0));
console.log(bdViewModel());
// 'bdViewModel' must be called as function (with open and close parentheses) to see the data.
$.each(bdViewModel(), function (i, d) {
$("#bdList").append("<li>" + d.y() + "</li>");
});
以下是用于比较映射JS数组和JSON的JSBin:http://jsbin.com/uzuged/5/
ko.mapping.fromJS(data, {}, self.items);