获取backbone.js中模型的属性

时间:2012-03-22 09:30:54

标签: javascript ajax rest backbone.js

我有这个模型

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"));

我想要的是简单地获取模型的属性。现在我在萤火虫上有这个。此外,当我在浏览器上运行它时,我会收到警告成功,下一个警告是未定义enter image description here

这是输出:

{"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}]}

这只是它返回的项目之一。我刚刚发布了项目,所以它不会那么长。

2 个答案:

答案 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"));
}