Backbone-relational.js + Backbone.View(s)

Вопрос: Документации мало, а я немного нуб -- может ли кто-нибудь подтвердить правильный (при условии, что он есть) способ привязки Backbone.Views к экземплярам Backbone.RelationalModel (от backbone-relational.js) для обновления/рендеринга в дом? Я пробовал несколько разных подходов, основанных на обычной привязке Model/View в Backbone, но без особого успеха.

Предыстория (/дополнительная информация): я изучаю основы работы с Backbone.js, и за последнюю неделю мне пришлось многому научиться. Если я упустил что-то очевидное (что весьма вероятно, включая «правильный» способ решения моей проблемы, описанный ниже), позвоните мне.

Я имею дело с интерфейсом REST, поддерживаемым mongodb (над которым у меня нет полного контроля, иначе я бы перепроектировал поведение на стороне сервера), который использует преимущества вложенных словарей, поэтому я читайте о том, как лучше всего представить это в Backbone (при этом не нарушая великолепный материал save() + синхронизацию с сервером, который предоставляет Backbone).

Я видел два варианта: backbone-relational и ligament.js.

Я начал с backbone-relational.js и создал RelationalModels (замена backbone-relational для стандартной модели Backbone) для различных словарей в дереве, которые возвращаются интерфейсом REST. Отношения между ними определены, и консоль, записывающая JSON из каждой модели (в соответствующих функциях инициализации), показывает, что все они правильно вызываются/загружаются с сервера с помощью команды fetch() на общем уровне коллекции.

Итак, все отлично.

Проблема: у меня есть представления, «прослушивающие» обновления для каждой из этих моделей (и связанные функции, которые должны отображать шаблоны в домене), и они вообще никогда не «срабатывают» (не говоря уже о рендеринге...). Основное представление срабатывает на fetch(), без проблем, загружая модель «верхнего уровня» и отображая ее в dom, но представления, которые представляют модели «внешнего ключа» в этой модели «верхнего уровня», никогда не делают этого (хотя данные ОПРЕДЕЛЕННО загружаются в каждую модель, о чем свидетельствует ведение журнала консоли для каждой модели, упомянутой выше).

Любые идеи будут очень, очень признательны.

В прямом ответе на ответ Raynos ниже (спасибо, Raynos!): Если бы я определил базовый URL-адрес для коллекции UpperLevelCollection с моделями UpperLevelModel, существующими по адресу (URL-адрес UpperLevelCollection)/(идентификатор модели UpperLevelModel) на сервере, как бы я сопоставить эти коллекции LowerLevelCollections с ключами словаря в одном дампе JSON для каждой модели UpperLevelModel со стороны сервера? Другими словами, может ли использование коллекций в моделях правильно обрабатывать дамп данных с сервера, подобный этому (очевидно, очень упрощенный, но решает проблему) И правильно сохранять/обновлять/синхронизировать его обратно?

[{
    "some_key": "Some string",
    "labels": ["A","List","Of","Strings"],
    "content": [{
        "id": "12345"
        "another_key": "Some string", 
        "list": ["A","list","of","strings"],
    },{
        "id": "67890"
        "another_key": "Some string", 
        "list": ["A","list","of","strings"],
    }],
}]

person ltd    schedule 21.06.2011    source источник


Ответы (2)


Обычно для вложенных словарей я использую следующий подход

var UpperLevelCollection = Backbone.Collection.extend({
    model: UpperLevelModel
  }),
  UpperLevelModel = Backbone.model.extend({
    initialize: function() {
      this.nested = new LowerLevelCollection;
    }
  }),
  LowerLevelCollection = Backbone.Collection.extend({
    model: LowerLevelModel
  }),
  LowerLevelModel = Backbone.Model.extend({});

Просто вложите эти коллекции в модели до упора.

person Raynos    schedule 21.06.2011
comment
Спасибо Райнос. Вот как я изначально подошел к этому, но немного беспокоился, что это не будет хорошо работать с сервером (и с сохранением/синхронизацией), если URL-адрес для моделей UpperLevelModel(s) фактически возвращает полное дерево (с моделями LowerLevelModel, перечисленными в содержимом ключ). Я добавил кусок к своему исходному сообщению (слишком много символов для ответа здесь). Еще раз спасибо за помощь - я не в себе (явно). - person ltd; 22.06.2011
comment
@ltd переопределить .parse пример и переопределить .toJSON чтобы чтение и запись данных работали. toJSON должен возвращать объект (не строку json), который вы хотите отправить в монго при сохранении. - person Raynos; 22.06.2011
comment
Отлично -- еще раз спасибо. Я разработал модели, как вы предложили, и, похоже, все отлично работает на стороне данных. Теперь, последний вопрос (надеюсь): как правильно связать события добавления/обновления/и т. д. в представлении UpperLevelModel (предполагая, что это произойдет?) с LowerLevelModel/Collection? На верхнем уровне представления приложения я могу связать эти события для отображения представлений UpperLevelModel, но у меня возникают некоторые проблемы, когда речь идет о дочерних моделях/представлениях. В качестве альтернативы, должен ли я просто отображать модель UpperLevelModel (включая дочернюю коллекцию/модели) в одном представлении? - person ltd; 22.06.2011
comment
@ltd слишком расплывчато, чтобы предложить оптимальное решение. Создайте новый вопрос с примерами кода. - person Raynos; 22.06.2011

Проблема может заключаться в том, что когда вы загружаете новые данные в ParentModel, ваша дочерняя коллекция AFAIK на самом деле не извлекается, она стирается и заменяется новой коллекцией (см. Backbone.HasMany.OnChange в строке 584 в backbone-relational.js). Таким образом, ваши собственные привязки к дочерней коллекции исчезли.

Это, на мой взгляд, слабость с магистральными связями. Это поведение должно быть настраиваемым, с возможностью использования более медленного подхода «найти и обновить» вместо «стереть и заменить».

person Jens Alm    schedule 10.01.2012