Магистраль: получить коллекцию с сервера - PullRequest
14 голосов
/ 31 марта 2011

Я пытаюсь получить коллекцию с моего сервера. Я использую версию 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(), и причина в том, что мои элементы представляют собой список строк ... Мой сервер отправил их неправильно.

Ответы [ 2 ]

23 голосов
/ 31 марта 2011

Поскольку вы уже определили, что ваш формат ответа не соответствует ожидаемому 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;
},

Как вы можете видеть, функция по умолчанию просто передает данные.Вы должны будете заставить его работать для вашего формата ответа.

PS id рекомендует размещать точку останова в методе Backbone.fetch, чтобы увидеть, какой формат исходит от сервера и где именно он прерывает создание модели.

20 голосов
/ 02 июля 2011

вместо

["id1", "id2", ..., "idn"]

клиент ожидает

[{"id": "id1"}, ... {"id": "idn"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...