Tôi giả sử bạn đang nhận được một danh sách loại/Các đề mục trong JSON trông giống như sau này ...
{
'id': 1,
'name': 'My 1st Category',
'children': [
{
'id': 2,
'name': 'My 2nd Category',
'children': []
},
{
'id': 1,
'name': 'An Item',
'price': 109.99
}
]
}
Backbone.js không có bất kỳ thứ gì ngoài hộp hỗ trợ nhiều mô hình trong bộ sưu tập, nhưng cũng không có bất kỳ hạn chế nào về loại mô hình bạn đưa vào bộ sưu tập .
Chỉ định loại mô hình trong định nghĩa bộ sưu tập chỉ có một điều, nó cho phép Backbone biết loại mô hình nào sẽ tạo nếu bạn chuyển JSON thô vào bộ sưu tập thay vì đối tượng Backbone.Model
. Nếu bạn thêm một mô hình Item
vào một bộ sưu tập đã chứa một vài mô hình Category
, xương sống sẽ không có vấn đề gì khi đưa nó vào danh sách mô hình; nó không làm bất kỳ kiểm tra kiểu nào.
Vì vậy, với ý nghĩ đó, bạn có thể sử dụng hầu hết mọi thứ mà bộ sưu tập cung cấp ngoại trừ truyền JSON thô; bạn sẽ cần phải tự mình xử lý. Vì vậy, lựa chọn của bạn là xây dựng mô hình của bạn trước, biến chúng thành các đối tượng Backbone.Model
hoặc tạo một thứ gì đó sẽ thực hiện phân tích cú pháp cho bạn.
Đối với tùy chọn thứ hai, trình phân tích cú pháp, tôi khuyên bạn nên chuyển một biến đặc biệt cho bộ sưu tập chứa JSON thô của bạn, sau đó xử lý trong hàm initialize
của bạn. Dưới đây là một ví dụ:
var CategoryCollection = Backbone.Collection.extend({
initialize: function(m, models) {
_.each(models, function(model) {
var modelObject = null;
if (model.price !== undefined) {
modelObject = new Item(model);
} else {
modelObject = new Category(model);
}
this.add(modelObject);
}, this);
}
});
Vì vậy, nó là một chút hacky, nhưng bạn xác định loại mô hình dựa trên nếu nó có một lĩnh vực cụ thể (price
trong ví dụ của tôi), tạo ra các đối tượng mô hình, sau đó bổ sung vào bộ sưu tập.
Sau đó bạn muốn gọi nó theo cách này:
var myCollection = new CategoryCollection([], myJSON);
Chú ý bạn phải vượt qua một mảng trống rỗng như là đối số đầu tiên kể từ đó là làm sao cậu thường thông qua một tập hợp các mô hình để bộ sưu tập.
Sau này khi sử dụng bộ sưu tập, bạn có thể xác định xem bạn đang làm việc với một Item
hoặc Category
sử dụng đơn giản instanceof
kiểm tra:
_.each(myCollection.models, function(model) {
if (model instanceof Item) {
console.log("It's an Item! Price: ", model.get("price"));
} else {
console.log("It's a Category!");
}
});
Tóm lại, tôi muốn nói, "Tôi không hiểu tại sao không", nhưng tôi tò mò những gì người khác có thể nói. – JayC