我目前正在使用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()
并在模型级别添加介体作为依赖项。
添加像这样的大型全局对象会增加相当大的依赖性,从而导致测试变得困难。假设调解员甚至可以提供项目似乎也是错误的。也许它可以制作模型,获取它并返回它,如果它不存在。
这里的任何帮助都会很棒!我很想知道其他人是如何解决这个问题的。
答案 0 :(得分:4)
我建议您为所有Collection
型号提供通用Task
。种缓存。
类似于:App.Store.Tasks
。
任何时候您需要先Poject.Tasks
先App.Store.Tasks
看看Task
,然后:
<强> A 即可。如果您在那里找到了Project.Tasks
,请将其添加到create
。
<强>乙即可。如果找不到fetch
,App.Store.Tasks
,则将其添加到Project.Tasks
和Project
。
这样,尝试fetch
已经退出的Task
的其他Model
将会执行相同操作,并且他们将共享相同的Task
。
每当您修改Project
中的某个Task
模型时,您将在其他所有Project
中修改此{{1}}。