Использование функций для управления отношениями в 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];
});