Ответ 1
вместо
["id1", "id2", ..., "idn"]
клиент ожидает
[{"id": "id1"}, ... {"id": "idn"}]
Я пытаюсь получить коллекцию с моего сервера. Я использую версию 0.3.3 (не мастер из github) Однако я запускаю в этом исключении:
Uncaught TypeError: Cannot use 'in' operator to search for 'id' in {id=MyId, active=true}
jQuery.jQuery.extend._Deferred.deferred.resolveWith (jquery.js:869)
done (jquery.js:6591)
jQuery.ajaxTransport.send.callback
Так я создал ошибку:
var MyModel = Backbone.Model.extend();
var MyCollection = Backbone.Collection.extend({
url: '/api/collection',
model: MyModel
});
var coll = new MyCollection();
coll.fetch();
Элементы в /api/collection анализируются в JSON. Я попытался вернуть их в различных форматах
["Id1", "Id2", ... ]
[{id: "Id1, somethingElse: "..."}, ...]
{id1: { id1s content}, id2: { ... }, ...}
Однако ошибка всегда была одинаковой. Что не так с этим кодом?
[Изменить] Это не помогает установить ошибку с помощью coll.fetch({error: errorFunc});
Исключение остается прежним.
[Edit2] Ну, похоже, все работает нормально, пока collection.fetch()
не вызовет collection.refresh()
с объектом ответа. Я не перезаписал ни одну из этих функций.
[Edit3] Ошибка в методе collection.add()
, и причина в том, что мои элементы представляют собой список строк... Мой сервер неправильно отправил их.
вместо
["id1", "id2", ..., "idn"]
клиент ожидает
[{"id": "id1"}, ... {"id": "idn"}]
Поскольку вы уже определили, что ваш формат ответа не соответствует ожиданиям Backbone, вы должны переопределить функцию YourModel.parse, которая должна принимать ответ с вашего сервера и возвращать массив моделей, приемлемых для коллекции. Вот фрагмент из Backbone.js
// **parse** converts a response into a list of models to be added to the
// collection. The default implementation is just to pass it through.
parse : function(resp) {
return resp;
},
Как вы видите, функция по умолчанию просто передает данные через. Вам нужно будет заставить его работать для вашего формата ответа.
P.S. id рекомендуется поместить точку останова в метод Backbone.fetch, чтобы узнать, какой формат поступает с сервера и где именно он нарушает создание модели.