В настоящее время я создаю приложение, используя 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()
Вместо этого добавьте медиатор в качестве зависимости на уровне модели.
Добавление такого большого глобального объекта добавляет довольно большую зависимость, что может затруднить тестирование. Также кажется неправильным предполагать, что посреднику даже будет доступен проект. Может быть, он может сделать модель, получить ее и вернуть, если она не существует.
Любая помощь здесь будет отличной! Я хотел бы знать, как другие люди решили эту проблему.