2012-03-22 27 views
6

Tôi có mô hình nàyNhận thuộc tính của mô hình trong backbone.js

var Item = Backbone.Model.extend({ 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

var onSuccess = function(){ alert("success"); }; 

Và một bộ sưu tập

var Items = Backbone.Collection.extend({ 
    model: Item 
}); 

Và phần còn lại của mã của tôi là ở đây:

var item = new Item(); 
var items = new Items(); 
item.fetch({ success: onSuccess }); 
alert(items.get("ItemCode")); 

Những gì tôi muốn đơn giản là lấy các thuộc tính của mô hình. Bây giờ tôi có điều này trên firebug. Ngoài ra khi tôi chạy nó trên trình duyệt, tôi nhận được cảnh báo thành công và cảnh báo tiếp theo là không xác định. enter image description here

Đây là kết quả:

{"ErrorMessage":null,"Items":[{"ErrorMessage":null,"CategoryCode":"Event Materials","ClassCode":null,"Components":null,"GroupCode":null,"ImageURL":null,"ItemCode":"ITEM-123","ItemDescription":"Old World Lamppost\u000d\u000a\u000d\u000a","ItemName":"GET123","ItemType":null,"KitItem":null,"Matrix":null,"Prefix":null,"RetailPrice":107.990000,"SalesTaxCode":null,"UPCCode":null,"UnitMeasureCode":"EACH","UnitsInStock":0,"Value":null,"WholesalePrice":95.000000}]} 

LƯU Ý

Đó chỉ là một trong những mặt hàng nó trả về. Tôi chỉ đăng trên mục để nó sẽ không được lâu.

Trả lời

10

Bạn đang kêu gọi get vào bộ sưu tập của bạn (xem http://documentcloud.github.com/backbone/#Collection-get)

Có vẻ như những gì bạn thực sự muốn là lặp qua bộ sưu tập và gọi điện cho mỗi mục

items.each(function(item) { 
    item.get('ItemCode'); 
}); 

Nếu không, vui lòng giải thích!

Ngoài ra, nếu url mô hình của bạn phản hồi với danh sách mô hình, bạn nên xác định thuộc tính url trong Bộ sưu tập của bạn thay vì mô hình của bạn.

var Items = Backbone.Collection.extend({ 
    model: Item, 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

Và câu trả lời của bạn nên là một mảng, với mục như các phần tử mảng [<item1>, <item2>, ...], chứ không phải là một đối tượng JSON với {'Items': [<item1>, <item2>, ...] }. Nếu bạn không muốn sửa đổi phản hồi, bạn sẽ phải triển khai chức năng parse trên bộ sưu tập của mình (http://documentcloud.github.com/backbone/#Collection-parse).

Ngoài ra, như @chiborg đề cập, bạn đang gọi get ngay sau fetch (sẽ hoàn thành không đồng bộ), vì vậy không đảm bảo rằng dữ liệu của bạn sẽ có sẵn.

Giải pháp thích hợp ở đây là liên kết trình nghe 'làm mới' trên bộ sưu tập.

items.on('refresh', function() { 
    // now you have access to the updated collection 
}, items); 
+0

xin lỗi về phần mô hình. Tôi chỉ thử nghiệm trên nó vì tôi nhận thấy rằng mô hình Item không nhận được các thuộc tính trống rỗng của nó. Cũng về điều phân tích cú pháp. Tôi đã thử nó nhưng sau khi tôi thực thi mã nó không lấy mô hình. Thuộc tính mô hình của bộ sưu tập trống "[]" nhưng tôi có mô hình: Mục – jongbanaag

+0

Url Mô hình/Bộ sưu tập của bạn (localhost/InterprisePOS ...) trả về là gì? – jlb

+0

tôi đã thêm mã ở trên. – jongbanaag

2

Điều này là do tải mô hình asynchonously - item.get("ItemCode") sẽ chỉ hoạt động sau khi mô hình đã được tải với fetch. Hãy thử gọi nó trong hàm onSuccess của bạn.

Ngoài ra, lưu ý rằng nó sẽ không giúp khởi tạo trực tiếp Item. Những gì bạn đang cố gắng làm là có được một yếu tố trong bộ sưu tập Items và sau đó gọi item.get("ItemCode") trên yếu tố đó, như thế này:

function onSuccess() { 
    alert('success') 
    var item = items.get(13); // get item with id 13 
    alert(item.get("ItemCode")); 
} 
+0

Tôi đã thử mã của bạn. Nhưng tôi ném một lỗi nói rằng mục từ (alert (item.get())) là không xác định. – jongbanaag

+0

Tôi xin lỗi, tôi không xem kết quả từ yêu cầu AJAX. Lớp Collection của Backbone.js mong đợi một mảng được trả về, không phải là một đối tượng mà các mục trong bộ sưu tập được lồng trong nó. Bạn có thể thay đổi những gì được trả về ở phía máy chủ, trả về jsut mảng xuất hiện sau "Items"? – chiborg

Các vấn đề liên quan