Backbone:预取集合

时间:2012-01-10 00:49:23

标签: javascript json backbone.js

我有一个骨干应用程序,在加载时需要从四个不同的集合中获取数据(Rails - > JSON后端)。

这是对服务器的四次点击,我猜这是一种更好的方法。

我开始试图将Rails to_json()的查询结果传递到Rails视图中的路由器初始化,例如:

<script type="text/javascript">
  $(function() {
      window.router = new Backbonedemo.Routers.CalendarsRouter({calendars: [], tasks: <%= @tasks %>});
      Backbone.history.start();
      });
</script>

但这并没有带来欢乐。

那么,在启动时运行等效的fetch()的正确方法是什么,而不必为我想要收集的每个集合命中JSON?

2 个答案:

答案 0 :(得分:3)

查看rabl宝石。它允许您以比常规to_json允许的更大的程度自定义您的json响应。

这是设置项目的基本方法,您需要预先提供大量JSON:

首先,设置控制器以在页面加载时提取数据,因为检查localhost:3000/home将查看主控制器索引:

class HomeController < ApplicationController
  def index
    @user = current_user
    render 'user.json' # this line is not actually required most of the time when using backbone and proper ajax/json requests
  end
end

接下来,设置一个rabl模板,取代视图或部分模板,并将JSON返回给您的客户端。我实际上将使用partial,以便在home / index.html视图中轻松加载:

# views/home/_user.json.rabl
object @user
attributes :id, :first_name, :last_name, :birthdate, :gender, :nickname, :email
node(:avatar_thumb_url) { |u| u.avatar.url :thumb }
node(:roles) { |u| u.roles }
node(:name) { |u| "#{u.first_name} #{u.last_name}".strip }
node(:errors) { |u| u.errors.to_hash if u.errors.present? }
child :awesome_calendars => :calendars do
  attributes :id, :date, :description
  child :events do
    attributes :title, :description
  end
end

这是一个相对花哨的rabl,它将在一个JSON对象中提供一堆json,包括一组相关的记录。

在加载骨干网的html视图中,您需要将控制器的对象传递给部分:

# views/home/index.html.erb
<script type='text/javascript'>
    $(function() {
      window.router = new Backbonedemo.Routers.CalendarsRouter(<%= render('user.json.rabl', user: @user).html_safe -%>);
    Backbone.history.start();
  });
</script>

回顾一下:

  1. 控制器呈现常规html.erb视图(启动主干的视图)
  2. 该视图也呈现部分 - 此部分是rabl模板,严格返回JSON
  3. backbone使用JSON并随意使用它。
  4. 这样做的好处是,您可以为任何控制器操作设置json.rabl响应,并让它们返回各种json内容,这些内容都很容易控制。我在上面做的是“困难”的部分,你想要将许多表中的东西加载到第一个页面加载的单个JSON调用中 - 避免多个AJAX /骨干提取请求。

    有意义吗?我希望如此......:/如果有什么不清楚,请告诉我。

答案 1 :(得分:1)

我不知道Rails,但请参阅"bootstrap" example in the Backbone docs

<script>
  Accounts.reset(<%= @accounts.to_json %>);
  Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>

通常,我认为您需要创建集合对象,然后reset()使用内联JSON数据。