Backbone.js - 全局/共享/相关模型的最佳方法是什么?

时间:2012-03-23 05:12:09

标签: javascript design-patterns architecture model backbone.js

我目前正在使用Backbone.js构建一个应用程序,该应用程序具有许多不同的模型,这些模型都以各种方式相互关联。我目前正在尝试各种架构方法。

简而言之,模型关系看起来像这样:

Workspace > Projects > Tasks

还有一些其他模型,例如列表和类别,附加到项目中。

在包含任务列表的页面上,我将任务的JSON转储到页面上并填写集合。这项工作正常,但目前所有任务都在提取他们自己的项目数据。

task.project.id
task.project.name

项目也被拉到页面上的各个其他位置以获取各种列表。任务也可以是分配给项目的List的一部分。这意味着我也要求在各个地方提取项目列表。

这个问题的主要问题是,在更新模型时,我需要找到一些方法来“同步”它们。哪个是疯了。它们都应该使用相同的模型实例,以便每个视图使用相同的模型并相应地更新,而无需执行任何操作。

我一直在研究各种Backbone.js架构设计,试图找到答案。例如,卓别林(https://github.com/moviepilot/chaplin)使用中介对象在视图之间传递数据。使用这种方法,我可以在中介上有一个Projects集合,并通过中介对象将它传递给各种视图。

每个项目都会包含所有列表,类别,指定用户等。然后我可以请求项目模型:

App.Projects.get(12)

然后任务只需要项目ID以及getter和setter方法。视图可以轻松访问可用项目,项目列表,项目用户,而无需依赖于挖掘模型或进行进一步的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)

或使用getter方法:

var project = model.getProject()

并在模型级别添加介体作为依赖项。

添加像这样的大型全局对象会增加相当大的依赖性,从而导致测试变得困难。假设调解员甚至可以提供项目似乎也是错误的。也许它可以制作模型,获取它并返回它,如果它不存在。

这里的任何帮助都会很棒!我很想知道其他人是如何解决这个问题的。

1 个答案:

答案 0 :(得分:4)

我建议您为所有Collection型号提供通用Task 。种缓存

类似于:App.Store.Tasks

任何时候您需要先Poject.TasksApp.Store.Tasks看看Task,然后:

<强> A 即可。如果您在那里找到了Project.Tasks,请将其添加到create

<强>乙即可。如果找不到fetchApp.Store.Tasks,则将其添加到Project.TasksProject

这样,尝试fetch已经退出的Task的其他Model将会执行相同操作,并且他们将共享相同的Task

每当您修改Project中的某个Task模型时,您将在其他所有Project中修改此{{1}}。