gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:49:55 24 4
gpt4 key购买 nike

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

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

Workspace > Projects > Tasks

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

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

task.project.id
task.project.name

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

这样做的主要问题是,当就地更新模型时,我需要找到某种方法来“同步”它们。这太疯狂了。它们都应该使用相同的模型实例,以便每个 View 都使用相同的模型并进行相应更新,而无需执行任何操作。

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

每个项目都会包括它的所有列表、类别、分配的用户等。然后我可以像这样请求一个项目模型:

App.Projects.get(12)

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

并改为在模型级别将中介添加为依赖项。

像这样添加一个大的全局对象会增加相当大的依赖性,这可能会使测试变得困难。假设调解人甚至可以使用该项目似乎也是错误的。也许它可以制作模型,获取它并在它不存在时返回它。

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

最佳答案

我建议为所有Task 模型创建一个通用Collection。一种缓存

类似于:App.Store.Tasks

任何时候您需要提供 Poject.Tasks 时,首先查看 App.Store.Tasks,然后:

一个。如果您在那里找到了 Task,那么将其添加到您的 Project.Tasks 中。

B。如果在那里找不到,则创建获取并将其添加到两者:App.Store.Tasks 和您的Project.Tasks.

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

任何时候你在一个Project中修改你的一个Task模型,你将在所有其他Project中修改这个Task

关于javascript - Backbone.js - 全局/共享/相关模型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9834448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com