2012-03-22 7 views
6

У меня есть эта модельПолучить атрибуты модели в 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")); 

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

ПРИМЕЧАНИЕ

Это лишь один из пунктов, которые он возвращает. Я просто отправил на предмет, чтобы он не был таким длинным.

ответ

10

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

Кажется, что вы действительно хотите, чтобы перебирать коллекцию и набирать по каждому пункту

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

Если нет, то пожалуйста уточните!

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

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

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

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

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

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

извините за модель часть. Я просто экспериментирую с ним, так как я заметил, что элемент модели не получает атрибуты пустым. Также о синтаксическом анализе. Я попробовал, но после выполнения кода он не извлекает модель. Атрибут model коллекции пуст «[]», но у меня есть модель: Item – jongbanaag

+0

Что возвращает ваш URL-адрес модели/коллекции (localhost/InterprisePOS ...)? – jlb

+0

Я добавил код выше. – jongbanaag

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")); 
} 
+0

Я пробовал ваш код. Но я выбрал ошибку, указав, что этот элемент из (alert (item.get())) не определен. – jongbanaag

+0

Прошу прощения, я не смотрел результат по запросу AJAX. Класс коллекции Backbone.js ожидает, что массив будет возвращен, а не объект, в котором элементы коллекции вложены в него. Можете ли вы изменить то, что возвращается на стороне сервера, возвращая jsut массив, который появляется после «Items»? – chiborg

Смежные вопросы