У меня такая же проблема, когда я пишу свое Backbone-приложение. Приходится иметь дело со встроенными / вложенными моделями. Я сделал несколько настроек, которые, на мой взгляд, были довольно элегантным решением.
Да, вы можете изменить метод синтаксического анализа, чтобы изменить атрибуты в объекте, но все это на самом деле довольно неудобный код IMO, и он больше похож на взлом, чем на решение.
Вот что я предлагаю для вашего примера:
Сначала определите вашу модель макета вот так.
var layoutModel = Backbone.Model.extend({});
Тогда вот ваша модель изображения:
var imageModel = Backbone.Model.extend({
model: {
layout: layoutModel,
},
parse: function(response){
for(var key in this.model)
{
var embeddedClass = this.model[key];
var embeddedData = response[key];
response[key] = new embeddedClass(embeddedData, {parse:true});
}
return response;
}
});
Обратите внимание, что я не вмешивался в саму модель, а просто вернул желаемый объект из метода анализа.
Это должно гарантировать структуру вложенной модели при чтении с сервера. Теперь вы могли бы заметить, что сохранение или настройка на самом деле здесь не обрабатывается, потому что я считаю, что для вас имеет смысл явно установить вложенную модель с использованием правильной модели.
Вот так:
image.set({layout : new Layout({x: 100, y: 100})})
Также обратите внимание, что вы фактически вызываете метод анализа в своей вложенной модели, вызывая:
new embeddedClass(embeddedData, {parse:true});
Вы можете определить столько вложенных моделей в model
поле, сколько вам нужно.
Конечно, если вы хотите зайти так далеко, чтобы сохранить вложенную модель в отдельной таблице. Этого было бы недостаточно. Но в случае чтения и сохранения объекта в целом этого решения должно хватить.
define(['modelFile'], function(MyModel){... do something with MyModel})
Но вы правы. У меня есть привычка ссылаться на модель в соответствии с предложенным вами соглашением.Backbone.Model.prototype.parse
функцию. Затем все, что нужно сделать вашим моделям, - это определить типы объектов подмоделей (в атрибуте «модель»).Я публикую этот код как пример предложения Питера Лайона переопределить синтаксический анализ. У меня был тот же вопрос, и это сработало для меня (с бэкэндом Rails). Этот код написан на Coffeescript. Я сделал несколько вещей понятными для людей, незнакомых с ним.
или в JS
источник
Использование
Backbone.AssociatedModel
из Backbone-ассоциаций :источник
Я не уверен, что у Backbone есть рекомендуемый способ сделать это. Есть ли у объекта Layout собственный идентификатор и запись в серверной базе данных? Если это так, вы можете сделать его собственной моделью, как и у вас. Если нет, то вы можете просто оставить его в качестве вложенного документа, просто убедитесь , что вы преобразовать его в и из JSON должным образом в
save
иparse
методов. Если вы в конечном итоге воспользуетесь таким подходом, я думаю, что ваш пример A более совместим с backbone, поскольку онset
будет правильно обновлятьсяattributes
, но опять же, я не уверен, что Backbone делает с вложенными моделями по умолчанию. Скорее всего, для этого вам понадобится специальный код.источник
new
оператора. Я отредактировал его, чтобы исправить эту ошибку.Я бы выбрал вариант Б, если вы хотите, чтобы все было проще.
Еще один хороший вариант - использовать Backbone-Relational . Вы бы просто определили что-то вроде:
источник
Я использую плагин Backbone DeepModel для вложенных моделей и атрибутов.
https://github.com/powmedia/backbone-deep-model
Вы можете привязать изменения к событиям на n уровней. например:
model.on('change:example.nestedmodel.attribute', this.myFunction);
источник
Версия CoffeeScript красивого ответа rycfung :
Разве это не мило? ;)
источник
У меня была такая же проблема, и я экспериментировал с кодом в ответе rycfung , что является отличным предложением.
Однако, если вы не хотите
set
напрямую обращаться к вложенным моделям или не хотите постоянно передавать{parse: true}
ихoptions
, другим подходом будет переопределениеset
себя.В Backbone 1.0.0 ,
set
называется вconstructor
,unset
,clear
,fetch
иsave
.Рассмотрим следующую супермодель для всех моделей, которым необходимо вкладывать модели и / или коллекции.
Обратите внимание , что
model
,_setModel
и_unsetModel
остается пустым на цели. На этом уровне абстракции вы, вероятно, не можете определить какие-либо разумные действия для обратных вызовов. Однако вы можете захотеть переопределить их в расширяющихся подмоделяхCompoundModel
.Эти обратные вызовы полезны, например, для привязки слушателей и распространения
change
событий.Пример:
Благодаря этому у вас есть автоматическое создание вложенной модели и распространение событий. Также предоставляется и протестирован пример использования:
Вывод:
источник
Я понимаю, что опаздываю на эту вечеринку, но недавно мы выпустили плагин для работы именно с этим сценарием. Это называется backbone-nestify .
Таким образом, ваша вложенная модель остается неизменной:
var Layout = Backbone.Model.extend({...});
Затем используйте плагин при определении содержащей модели (используя Underscore.extend ):
После этого, если у вас есть модель,
m
которая является экземпляромImage
, и вы установили JSON из вопросаm
, вы можете сделать:источник
Используйте backbone-формы
Он поддерживает вложенные формы, модели и toJSON. ВСЕ РАЗМЕЩЕННЫЕ
источник
Если вы не хотите , чтобы добавить еще одну базу, вы могли бы рассмотреть вопрос о создании базового класса с переопределяется
set
иtoJSON
и использовать его как это:Вам понадобится
BaseModel
этот ответ (доступный, если хотите, как суть ).источник
У нас тоже есть эта проблема, и сотрудник команды реализовал плагин с именем backbone-nested-attributes.
Использование очень простое. Пример:
При этом модель дерева может получить доступ к фруктам:
Вы можете увидеть больше информации здесь:
https://github.com/dtmtec/backbone-nested-attributes
источник