Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js模式:何时加载多个资源?_Javascript_Ruby On Rails_Backbone.js - Fatal编程技术网

Javascript Backbone.js模式:何时加载多个资源?

Javascript Backbone.js模式:何时加载多个资源?,javascript,ruby-on-rails,backbone.js,Javascript,Ruby On Rails,Backbone.js,大多数open Backbone.js单页应用程序和演示程序似乎处理一个或两个不同的资源,并且在最初加载页面时通常会在问题中填充集合 你们如何处理远程存储数据的多个(超过2或3个)不同资源?什么时候加载内容 Rails开发人员应该熟悉的一个示例: 存在一个当前用户对象,该对象与项目、团队、任务和发票模型有许多关联。我的客户端应用程序为这些模型提供了一些CRUD功能,可能还有一些额外的视图来连接东西,等等,总共有许多不同的视图和相应的路径。 我希望用户能够通过粘贴链接直接跳到这些路线中的任何一条,

大多数open Backbone.js单页应用程序和演示程序似乎处理一个或两个不同的资源,并且在最初加载页面时通常会在问题中填充集合

你们如何处理远程存储数据的多个(超过2或3个)不同资源?什么时候加载内容

Rails开发人员应该熟悉的一个示例

存在一个
当前用户
对象,该对象与
项目
团队
任务
发票
模型有许多关联。我的客户端应用程序为这些模型提供了一些CRUD功能,可能还有一些额外的视图来连接东西,等等,总共有许多不同的视图和相应的路径。 我希望用户能够通过粘贴链接直接跳到这些路线中的任何一条,比如说
/#project/34/invoices
,这将要求应用程序加载ID为34的项目以及连接到此项目的发票

人们如何解决这个问题,因为你可以很容易地在一个应用程序中遇到许多这样的情况?你刚开始加载所有东西吗

current_user: {
  projects: {
    invoices: {…},
    tasks: {…}
  tasks: {…}
  …
}
这对我来说似乎不干净,或者你有没有一个聪明的方法总是装载你需要的东西


干杯

我正在进行一个主干项目,您可以在这里查看:但更具体地说,可能是这个模型:

(有几个警告:这是我的第一个项目,几乎使用了我选择使用的所有技术,所以我肯定我犯了一些设计错误。如果你注意到任何事情,请给我发一个便条,让我试着修复它!我没有使用主干控制器,而是使用了我自己的,但我认为在你的情况下,默认控制器正是你想要的(我正在寻找。)

Backbone.js在处理事情的方法上非常简单。我认为如果你采用与rails世界中相同的方法来处理问题,那么它可能会变得更加明显,成为一个固溶体

例如,看看主干网路由/控制器的工作方式:

它将一个路由映射到一个事件,您可以将侦听器设置为该事件。因此,在上面的示例路由中,您可以触发一个事件,并让您的项目控制器捕获它并执行一些内容

如果您在Rails中实现这个示例,您的发票控制器将被调用,您将通过模型获取数据,然后将该数据发送到视图以进行渲染。主干的想法与此相同(尽管它比Rails世界涉及的代码更多)

在我的应用程序中,就是这样。用户在UI中做一些事情,触发一个事件,事件被捕获并发送给控制器。控制器的方法与rails中的名称非常相似:“获取”、“索引”、“创建”、“销毁”等。一旦模型完成了它的工作,它就会调用它的视图,并进行渲染,或者做任何它想做的事情需要做些什么

在上面的例子(tab.js)中,当一个选项卡被实例化时,它的TabContents集合被构建,但为空。这类似于rails(我认为)。rails不会加载整个kit n kaboodle,除非您要求它加载


希望这会有所帮助!

一种方法是在启动时加载足够的负载,以完成大多数高级任务。此后,较低级别的任务可能需要执行抓取以获取详细级别的资源

在差旅管理应用程序中,您可以为用户建立会话,并获取该用户以及该用户的任何预订。这将使您能够快速显示预订摘要,而无需进行其他服务器呼叫

请求更详细的预订数据可能需要较低级别的呼叫。例如,如果我有航班预订,我可能会定期呼叫航班状态信息


我认为关键问题在于你的缓存策略。你需要评估数据在你的应用程序中可以存在多长时间而不需要刷新。如果你的资源很快过时,那么应该在需要时提取它们。

我自己找到了一种方法来处理这个问题-也许这对其他人有帮助:

我正在扩展一个类,它实现了一个方法
isStale
。 这样,如果在某个时间内未执行此操作,我可以获取或“刷新”集合的数据:

if (this.collection.isStale()) {
  this.collection.fetch();
}

谢谢你的回答,我不想简化,但你基本上是在每个控制器动作中加载数据,对吗?基本上,但我会保留模型,因为这些数据可以通过UI更新/更改。我不确定这是正确的做法。记住REST是状态的,所以我正在做的是记录它的状态例如:当在界面中单击“添加选项卡”按钮时,它调用tabs\u controller create方法,该方法生成一个新的选项卡模型实例,然后与服务器同步。成功时,它呈现一个新的选项卡视图。销毁时,调用控制器的“销毁”方法,该方法获取本地模型,并与服务器同步服务器(在服务器上销毁它自己)。如果这是成功的,那么视图也会被调用来销毁它自己。我试图保持流程尽可能接近Rails所做的,以保持简单和简洁。