Получить атрибуты модели в backbone.js - PullRequest
7 голосов
/ 22 марта 2012

У меня есть эта модель

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

Что я хочу, так это просто получить атрибуты модели. Теперь у меня есть это на firebug. Также, когда я запускаю его в браузере, я получаю предупреждение success , а следующее предупреждение - undefined . 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 ]

11 голосов
/ 22 марта 2012

Вы звоните get в своей коллекции (см. http://documentcloud.github.com/backbone/#Collection-get)

. Похоже, что вы действительно хотите перебрать коллекцию и вызвать get для каждого элемента

items.each(function(item) {
  item.get('ItemCode');
});
* 1007.* Если нет, уточните!

Кроме того, если ваш URL модели содержит список моделей, вы должны определить атрибут url в своей коллекции вместо вашей модели.

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

И ваш ответ должен быть массивом с Элементами в качестве элементов массива [<item1>, <item2>, ...], а не объектом JSON с {'Items': [<item1>, <item2>, ...] }. Если вы не хотите изменять ответ, вам придется реализовать функцию parse на вашемcollection (http://documentcloud.github.com/backbone/#Collection-parse).

Также, как упоминает @chiborg, вы звоните get сразу после fetch (что завершится асинхронно), поэтому нет гарантии, что ваши данные будутбыть доступным.

Правильное решение здесь - привязать слушателя 'refresh' к коллекции.

items.on('refresh', function() {
  // now you have access to the updated collection
}, items);
2 голосов
/ 22 марта 2012

Это связано с асинхронной загрузкой модели - 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"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...