0

我在使用主干 js 时遇到了一些困难。目前,我有一个通过 json 向骨干网提供信息的 rails 应用程序。看来这一切正常,因为当我导航到 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
4

2 回答 2

1

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

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

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

于 2012-04-26T17:17:26.557 回答
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. 您很少需要bindAll与 CoffeeScript一起使用,请改用粗箭头 ( =>)
  2. 视图上的model属性应按实例设置为单个模型(因此@event->@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)可能需要。
于 2012-04-26T19:36:28.797 回答