Backbone js模型/控制器将json数据分配给变量

时间:2012-04-08 03:34:39

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

我对骨干js有些困难。目前,我有一个rails应用程序,通过json向骨干网提供信息。看起来这都是正确的,因为当我导航到URL时,会显示json数据。当我使用fetch方法时,我遇到了困难。以下是我的代码:

jQuery ->
  class Event extends Backbone.Model
    url: '/events/get_last'
    defaults:
      name: 'This isnt from the server'
      date_of: '2012-03-01'
      max_attendees: '300'

  class EventList extends Backbone.Collection
    url: '/events/get_events'
    model: Event

  class EventView extends Backbone.View
    el: $ 'body'
    model: Event
    initialize: (options) -> 
      _.bindAll @
      @event = new Event
      @event.fetch()
      @render()
    render: ->
      $(@el).append "<span>#{@event.get 'name'}"


  class EventRouter extends Backbone.Router
    routes : 
        '' : 'home'
        'dashboard' : 'render_data_view'
        'default' : 'default_view'
    home: -> 
      console.log "home"

    render_data_view: ->
      event_view = new EventView

    default_view: ->
      console.log 'the default view was hit'

    initialize: ->
      Backbone.history.start(pushState: true)

  event_router = new EventRouter

2 个答案:

答案 0 :(得分:1)

查看主干文档:http://documentcloud.github.com/backbone/#Model-fetch

model.fetch({
 success: function(model, response) {...}, 
 error: function(model, response) {...}
});

您应该为fetch方法设置成功和错误方法。当您获得成功事件时,您可以调用render()。

答案 1 :(得分:1)

您的EventView应绑定到其模型的"change"事件,以便fetch自动触发事件:

  

抓取 model.fetch([options])

     

[...]如果服务器的状态与当前属性不同,将触发"change"事件。

所以你的观点应该更像这样:

class EventView extends Backbone.View
  el: 'body'
  initialize: (options) ->
    @model = new Event
    @model.on 'change', @render
    @model.fetch() # This will call `render` automatically.
  render: =>
    @$el.append "<span>#{@model.get 'name'}</span>"

一些注意事项:

  1. 您很少需要使用CoffeeScript bindAll,而是使用fat arrow (=>)
  2. 视图上的model属性应按实例设置为单个模型(因此@event - &gt; @model名称更改)。集合在类定义中设置了model属性集,集合的@model应该是模型类。
  3. 绑定到模型上的"change"事件意味着只要任何人更改模型,您的视图就会被通知(即@render将被调用),此事件的行为是除了Backbone之外,你应该使用它,每个fetch成功和错误处理程序更多地用于错误处理并向用户报告成功。
  4. 你真的应该关闭你的<span>元素。
  5. 该视图已有@$el,因此您可以使用该视图而不是$(@el)
  6. 您可以使用el: 'body'代替el: $ 'body',并将jQueryification留给Backbone。
  7. 如果您使用的是较旧的Backbone,那么:
    1. 您可能必须使用bind而不是on
    2. 您可能没有@$el,因此可能需要$(@el)