2012-03-11 28 views
7

Tôi đang cố gắng ánh xạ một mảng các đối tượng tới một ObservableArray với plugin ánh xạ loại bỏ. Bằng cách nào đó điều này dường như không làm việc cho tôi cả.Mảng ánh xạ hành vi lạ với observableArray với ko.mapping.fromJS

tôi chỉ thử nghiệm với Crome console để xác minh:

ko.mapping.fromJS([ { x: 1, y: "test" } ]) 

returns: 
[] 

Tôi đang làm gì sai? Nếu tôi thử các trang sau

ko.mapping.fromJS([ { x:1, y: "test" } ][0]) 

returns an object containing x and y as observables... 

tất cả đều hoạt động tốt. Sự khác biệt duy nhất là tôi chỉ cung cấp một đối tượng duy nhất thay vì một mảng các đối tượng. Nhưng nếu tôi đọc tài liệu của plugin ánh xạ chính xác, nó sẽ có thể xử lý việc tạo một ObservableArray ra khỏi một mảng bình thường.

Nhờ sự giúp đỡ của bạn,
Andreas

+7

Trong giao diện điều khiển của Chrome đảm bảo rằng bạn đang xem giá trị chưa được mở của 'myObservableArray()' của ObservableArray. Nó có thể gây hiểu nhầm khi chỉ in ra bản thân observableArray. –

+4

Như RP đã nêu ... bạn chỉ nhìn vào giá trị sai. Đây là một fiddle mà bạn có thể sử dụng để xác minh. Đặt một điểm ngắt trên dòng ko.mapping và gõ: ko.mapping.fromJS (dữ liệu) và bạn sẽ thấy []. Nếu bạn gõ: ko.mapping.fromJS (data)() và bạn thấy [Object, Object, Object, Object]. http://jsfiddle.net/jearles/y4b9e/8/ –

+1

Cảm ơn các bạn, Chrome đã lừa tôi bằng cách in chỉ [] cho biết một mảng trống. Nhưng bạn hoàn toàn đúng, nếu tôi nhưng niềng răng đằng sau biểu thức nó cho thấy nội dung hoàn toàn. Tuyệt vời để nhận được nhận xét sớm như vậy! Stackoverflow rocks ... – nttakr

Trả lời

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

Đó là những gì nó nên được làm (ít nhất là về mặt lý thuyết/tài liệu), nhưng dường như đó không phải là những gì nó làm. Tôi gặp cùng một vấn đề và tôi tin khác nữa: https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

Đối tượng phải:

{ "someName" : [ { x: 1, y: "test" } ] } 

Để gắn bó với schema đối tượng của bạn, bạn có thể sử dụng ko.utils.arrayMap để ánh xạ đối tượng để KO ViewModel của bạn : 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); 
}); 

EDIT

tôi đã làm một số nghiên cứu thêm về thứ và bạn có thể thực sự ánh xạ đối tượng mảng JS với ánh xạ KO, tuy nhiên, đối tượng sau bản đồ sẽ KHÔNG là mảng có thể quan sát được KO. Nó sẽ chỉ là thường xuyên đối tượng mảng JS và, cho rằng vấn đề, bạn có thể dữ liệu ràng buộc với 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>"); 
}); 

Đây là JSBin để so sánh các bản đồ mảng JS và JSON: http://jsbin.com/uzuged/5/

+0

Không sử dụng plugin ánh xạ hoạt động trong trường hợp của tôi. Tôi nhận được một mảng các đối tượng từ máy chủ và muốn ánh xạ nó tới một mảng quan sát được. Tôi đã sử dụng: self.MyObservArray (ko.utils.arrayMap (arrayfromServer, hàm (item) { trả về BlogObject mới (mục); })); – LKallipo