Backbone.js - использование синтаксиса без вызова fetch
Загрузка на страницу Я загружаю свои данные в свои коллекции через этот метод. Это отлично работает, но я столкнулся с проблемой, когда у меня есть подмодели, которые также нужно отличать.
Например, я возвращаю коллекцию JSON под названием Book, и каждый массив книг содержит 10-20 моделей, называемых Pages. Если я попытаюсь получить доступ к страницам напрямую, я получаю ошибку [object][object]
, поскольку Backbone не может определить, какой тип объекта он имеет.
Раньше, когда я использовал fetch
, я бы обошел это, используя коллекции, которые содержали действие parse
. В parse
я бы сделал что-то вроде:
Collection_Books = Backbone.Collection.extend({
model: Model_Book,
parse: function (response) {
response.Pages = new Collection_Pages(response.Pages);
return response;
}
});
Теперь, когда я напрямую обращаюсь к данным и не использую fetch
, документация подразумевает, что я больше не имею доступа к методу parse
.
Если я не использую fetch
или вызываю сервер при загрузке страницы, как я могу накладывать подмодели с помощью примера "Книги > Страницы"?
Ответы
Ответ 1
Обновить. Этот ответ теперь устарел, см. uglymunky answer для получения более актуальной информации.
Вы правы, parse
указано только для вызова во время fetch
, поэтому он не будет вызываться, когда вы 'Создание коллекции из необработанных данных.
Но поскольку вы контролируете необработанные данные, которые вы используете для начальной загрузки своей коллекции, вы можете сами вызвать свою коллекцию parse
:
var c = new YourCollection(
YourCollection.prototype.parse([
// attribute data goes here...
])
);
Демо: http://jsfiddle.net/ambiguous/kdaZ3/
Ваши методы parse
(как для коллекции, так и для модели) не должны заботиться об их вызывающем контексте, поэтому их непосредственное обращение с прототипа должно быть прекрасным.
Ответ 2
Не уверен, что это новое, но похоже, что вы также можете просто установить свойство parse
параметра options для вашего конструктора в true, указав конструктору метод parse:
modelInstance = new MyModel(obj, {parse: true});
http://backbonejs.org/#Model-constructor