使用ko.mapping.fromJS将数组映射到observableArray的奇怪行为

时间:2012-03-11 17:33:23

标签: knockout.js knockout-mapping-plugin

我正在尝试使用knockout映射插件将对象数组映射到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。

感谢您的帮助,
   安德烈亚斯

2 个答案:

答案 0 :(得分:1)

ko.mapping.fromJS(data, {}, self.items);

答案 1 :(得分:1)

这是应该做的事情(至少在理论/文档中),但显然这不是它正在做的事情。我遇到了同样的问题,我也相信其他问题:https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/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);
});

修改

我对此做了更多的研究,你实际上可以用JS映射来映射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/