Backbone.js - Каков наилучший подход для глобальных / общих / связанных моделей? - PullRequest
4 голосов
/ 23 марта 2012

В настоящее время я создаю приложение, используя Backbone.js с несколькими различными моделями, которые по-разному связаны друг с другом. В настоящее время я экспериментирую с различными архитектурными подходами.

В двух словах модель отношений выглядит примерно так:

Workspace > Projects > Tasks

Есть несколько других моделей, таких как списки и категории, которые прикреплены к проекту.

На странице со списком задач я выгружаю JSON задач на страницу и пополняю коллекцию. Это работает нормально, но на данный момент все задачи используют свои собственные данные проекта.

task.project.id
task.project.name

Проекты также загружаются в различные другие места на странице для различных списков. Задачи также могут быть частью списка, который назначен проекту. Это означает, что я также делаю запросы на получение списков для проекта в разных местах.

Основная проблема заключается в том, что при обновлении модели на месте мне нужно найти какой-нибудь способ их синхронизации. Что безумие Все они должны использовать один и тот же экземпляр модели, чтобы каждое представление использовало одну и ту же модель и соответственно обновлялось без необходимости что-либо делать.

Я исследовал различные архитектурные проекты Backbone.js, чтобы попытаться найти ответ. Чаплин (например, https://github.com/moviepilot/chaplin), использует объект-посредник для передачи данных между представлениями. Используя этот подход, я мог бы создать коллекцию Projects на посреднике и передать ее различным представлениям через объект-посредник.

Каждый проект будет включать в себя все его списки, категории, назначенных пользователей и т. Д. Затем я могу запросить модель проекта следующим образом:

App.Projects.get(12)

Тогда для задачи потребуется просто идентификатор проекта и метод получения и установки. Представления могут легко получить доступ к доступным проектам, спискам проектов, пользователям проектов, не полагаясь на копание в модели или дальнейшие вызовы AJAX. Кроме того, для моделей задач не требуется никаких данных проекта.

Однако сброс всех этих данных в глобальный объект кажется плохим.

Я мог бы в итоге получить что-то вроде этого:

App.Workspaces
App.Workspaces.get(1)
App.Projects
App.Projects.get(12).get('lists')[0]
App.Projects.get(12).get('users')

Чтобы использовать как это:

var projectId = model.get('project')
var project = App.Projects.get(projectId)

Или методом получения:

var project = model.getProject()

Вместо этого добавьте медиатор в качестве зависимости на уровне модели.

Добавление такого большого глобального объекта добавляет довольно большую зависимость, что может затруднить тестирование. Также кажется неправильным предполагать, что посреднику даже будет доступен проект. Может быть, он может сделать модель, получить ее и вернуть, если она не существует.

Любая помощь здесь будет отличной! Я хотел бы знать, как другие люди решили эту проблему.

1 Ответ

4 голосов
/ 23 марта 2012

Я рекомендую иметь общий Collection для всех ваших Task моделей. Вид кеш .

Что-то вроде: App.Store.Tasks.

В любое время, когда вам нужно скормить Poject.Tasks взгляд сначала в App.Store.Tasks, а затем:

A . Если вы нашли Task там, возьмите его и добавьте к своему Project.Tasks.

B . Если его там нет, то create, fetch и добавьте его к: App.Store.Tasks и вашему Project.Tasks.

Таким образом, другие Project, которые пытаются fetch a Task, которые уже выходят, будут делать то же самое, и они оба будут иметь одинаковые Model.

Каждый раз, когда вы изменяете одну из Task моделей в Project, вы будете изменять Task во всех остальных Project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...