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

时间:2011-06-23 08:45:42

标签: javascript ruby-on-rails backbone.js

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

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

一个示例,对于Rails devs来说应该是熟悉的:

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

人们如何解决这个问题,因为你可以轻松地在一个应用程序中结束这样的许多案例?你刚开始装载所有东西吗?

current_user: {
  projects: {
    invoices: {…},
    tasks: {…}
  tasks: {…}
  …
}

对我来说似乎不干净,或者你有一个聪明的方法来永远加载你需要的东西?

干杯!

3 个答案:

答案 0 :(得分:1)

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

在旅行管理应用中,您可以为用户建立会话并获取用户以及用户拥有的任何预订。这样您就可以快速显示预订摘要,而无需进行额外的服务器调用。

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

我认为关键问题围绕着您的缓存策略。您需要评估数据在应用程序中的存储时间,而无需刷新。如果您的资源快速失效,那么应该在需要时提取它们。

答案 1 :(得分:0)

我正在开发一个骨干项目,您可以在这里查看:http://sourceforge.net/projects/myelin/但更具体地说,可能是这个模型:http://myelin.git.sourceforge.net/git/gitweb.cgi?p=myelin/myelin;a=blob;f=public/javascripts/models/tab.js;h=6b4cb6ad26d2fc12a817ec027b60b2b5ef13f463;hb=HEAD

(有几点需要注意:这是我的第一个项目,使用了我选择使用的几乎所有技术,所以我很肯定我犯了一些设计错误。如果你发现任何问题,请给我一个便条,这样我就可以尝试解决它!我没有使用骨干控制器,并自己卷起来,但我认为在你的情况下,默认控制器正是你正在寻找的。)

Backbone.js是处理事物的方法。我认为,如果你采用与轨道世界相同的方式处理它,那么对于可靠的解决方案可能会变得更加明显。

例如,看一下Backbone做路由/控制器的方式:http://documentcloud.github.com/backbone/#Controller-routes

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

如果您在Rails中实现该示例,则会调用您的发票控制器,您将通过模型获取数据,然后将该数据发送到视图以使其呈现。与骨干相同的想法(虽然它比rails世界的代码更多)。

在我的应用中,这就是正在发生的事情。用户在UI中执行某些操作,触发事件,该事件被捕获并发送到控制器。控制器的方法与rails中的名称非常相似:'get','index','create','destroy'等...一旦模型完成了它的事情,它就会调用它的视图,渲染,或者不管它需要做什么。

在上面的示例(tab.js)中,当实例化Tab时,它的TabContents Collection已构建,但为空。这与rails类似(我认为)。除非你要求,否则Rails不会加载整个套件n kaboodle。

希望有所帮助!

答案 2 :(得分:0)

我找到了一种方法来处理这个问题 - 也许它可以帮助其他人:

我正在扩展一个实现方法isStale的{​​{3}}类。 像这样,如果在一段时间内没有这样做,我可以获取或“刷新”集合的数据:

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