我有这个模型
var Item = Backbone.Model.extend({
url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials'
});
var onSuccess = function(){ alert("success"); };
和一个集合
var Items = Backbone.Collection.extend({
model: Item
});
我的其余代码就在这里:
var item = new Item();
var items = new Items();
item.fetch({ success: onSuccess });
alert(items.get("ItemCode"));
我想要的是简单地获取模型的属性。现在我在萤火虫上有这个。此外,当我在浏览器上运行它时,我会收到警告成功,下一个警告是未定义。
这是输出:
{"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}]}
这只是它返回的项目之一。我刚刚发布了项目,所以它不会那么长。
答案 0 :(得分:11)
您在集合中呼叫get
(请参阅http://documentcloud.github.com/backbone/#Collection-get)
您真正想要的是迭代集合,并调用每个项目上的get
items.each(function(item) {
item.get('ItemCode');
});
如果没有,请详细说明!
此外,如果您的模型网址以模型列表进行响应,则应该在集合中定义url属性而不是模型。
var Items = Backbone.Collection.extend({
model: Item,
url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials'
});
你的响应应该是一个数组,Items为数组元素[<item1>, <item2>, ...]
,而不是带有{'Items': [<item1>, <item2>, ...] }
的JSON对象。如果您不想修改回复,则必须在集合(http://documentcloud.github.com/backbone/#Collection-parse)上实施parse
功能。
另外,正如@chiborg所提到的那样,您在get
之后立即调用fetch
(这将异步完成),因此无法保证您的数据可用。
这里适当的解决方案是在集合上绑定一个'refresh'监听器。
items.on('refresh', function() {
// now you have access to the updated collection
}, items);
答案 1 :(得分:2)
这是由于模型加载异常 - item.get("ItemCode")
仅在模型加载fetch
后才起作用。尝试在onSuccess函数中调用它。
此外,请注意,直接初始化Item
无济于事。你要做的是在集合Items
中获取一个元素,然后在该元素上调用item.get("ItemCode")
,如下所示:
function onSuccess() {
alert('success')
var item = items.get(13); // get item with id 13
alert(item.get("ItemCode"));
}