Использование функций для управления отношениями в Backbone

Я работаю (впервые) с Backbone.js над созданием достаточно простого приложения. В настоящее время я работаю с двумя организациями, которые имеют отношение один ко многим:

  • Проект: имеет много групп
  • Группа: принадлежит одному проекту

Я рассмотрел несколько разных способов представления отношений между моделями, от собственных рекомендаций Backbone до Ligament и от Backbone-реляционных. Однако в итоге я остановился на использовании простых вызовов функций. Например, в моей модели Project есть функция под названием groups():

groups: function() {
  return new Collections.Groups(groups.where({project_id: this.get('id')}));
}

А внутри модели группы:

project: function() {
  return projects.where({id: this.get('project_id')})[0];
}

Это позволяет мне делать такие вещи, как:

var foo = new Project();
var foo_groups = foo.groups();
foo_groups.at(0).get('name');

var bar = new Group();
var bar_project = bar.project();
bar_project.get('name');

Для меня компромисс здесь - это издержки на поддержание актуальных отношений (при использовании чего-то вроде магистральной-реляционной) по сравнению с временем обработки, используемым при вызове функции groups () каждый раз, когда вы хотите получить группы проекта.

Может ли кто-нибудь посоветовать мне какие-либо подводные камни, с которыми я могу столкнуться в будущем, когда я строю больше отношений таким образом, возможно, рекомендую лучшее решение (кроме расширений, упомянутых выше)? В конечном итоге приложение будет иметь около 6 объектов с различными отношениями "один ко многим" и "многие ко многим".

1 ответ

Project.groups

У меня есть реализация того, что я называю AutoUpdatedCollection,

Я использую его в сценарии, когда у вас есть общая коллекция, которая содержит каждую модель одного класса, и эта коллекция используется для заполнения подколлекций, которые должны быть обновлены при обновлении общей коллекции.

Проверьте реализацию Backbone AutoUpdatedCollection.

Следуя вашему примеру, я полагаю, что существует общая / общая коллекция window.groups тогда я буду реализовывать Project Модель, как это:

// code simplified and no tested
var Project = Backbone.Model.extend({
  initialize: function(){
    this.groups =
      new App.AutoUpdatedCollection({
        name:             "Project-" + this.id + "-groups",
        sourceCollection: window.groups,
        filterField:      "project_id",
        filterValue:      this.id
      }).filteredCollection;

    this.groups.on( "add", this.addGroup, this );
    this.groups.on( "remove", this.removeGroup, this );
  }
});

Может быть, не так просто, если у вас есть какие-либо проблемы, дайте мне знать.

Проектная группа

Я бы просто инициализировал Group.project атрибут в Group.initialize():

var Group = Backbone.Model.extend({
  this.project = window.projects.where({id: this.get('project_id')})[0];
});
Другие вопросы по тегам