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

Knockout.js 使用ko.mapping.fromJS将数组映射到observableArray的奇怪行为,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我正在尝试使用knockout映射插件将一组对象映射到一个observearray。 不知何故,这似乎对我根本不起作用 我刚刚使用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 o

我正在尝试使用knockout映射插件将一组对象映射到一个observearray。 不知何故,这似乎对我根本不起作用

我刚刚使用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的问题

谢谢你的帮助,

安德烈亚斯

这是它应该做的(至少在理论上/文献上),但显然这不是它正在做的。我也有同样的问题,我也相信其他问题:

ko.mapping.fromJS(data, {}, self.items);
对象必须是:

{ "someName" : [ { x: 1, y: "test" } ] }
要坚持使用对象模式,可以使用ko.utils.arrayMap将对象映射到ko ViewModel:

编辑

我在这方面做了更多的研究,实际上可以用KO映射来映射JS数组对象,但是,映射后的对象不是KO可观察数组。它将只是常规的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>");
});
var bd=[{x:1,y:bd test},{x:2,y:bd test 1dsf}];
var bdViewModel=ko.mapping.fromJS(bd);
//“bdViewModel”不是KO可观察数组,因此不能使用KO绑定。然而,“bdViewModel”(x和y)的所有属性都是可观察的。
//应用绑定(bdViewModel,$(“#bd”).get(0));
log(bdViewModel());
//“bdViewModel”必须作为函数调用(带左括号和右括号)才能查看数据。
$.each(bdViewModel(),函数(i,d){
$(“#bdList”)。追加(“
  • ”+d.y()+“
  • ”); });

    以下是用于比较映射JS数组和JSON的JSBin:

    在Chrome的控制台中,确保查看Observarray
    myObservableArray()
    的展开值。如果只是打印出observableArray本身,可能会产生误导。如RP所述。。。您只是看到了错误的值。这是一把小提琴,你可以用它来验证。在ko.mapping行上设置一个断点并键入:ko.mapping.fromJS(数据),您将看到[]。如果您键入:ko.mapping.fromJS(data)(),您会看到[Object,Object,Object,Object]。谢谢你们,Chrome欺骗了我,只打印了[],表示一个空数组。但是你是绝对正确的,如果我在表达式后面加括号,它显示的内容是正确的。很高兴这么快就收到评论!Stackoverflow rocks…不使用映射插件在我的案例中起作用。我从服务器获取一个对象数组,并希望将其映射到一个可观察的数组。我使用了:self.MyObservArray(ko.utils.arrayMap(arrayfromServer,函数(项){returnnewBlogObject(项);}));
    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>");
    });