我对骨干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
答案 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>"
一些注意事项:
bindAll
,而是使用fat arrow (=>
)。model
属性应按实例设置为单个模型(因此@event
- &gt; @model
名称更改)。集合在类定义中设置了model
属性集,集合的@model
应该是模型类。"change"
事件意味着只要任何人更改模型,您的视图就会被通知(即@render
将被调用),此事件的行为是除了Backbone之外,你应该使用它,每个fetch
成功和错误处理程序更多地用于错误处理并向用户报告成功。<span>
元素。@$el
,因此您可以使用该视图而不是$(@el)
。el: 'body'
代替el: $ 'body'
,并将jQueryification留给Backbone。bind
而不是on
。@$el
,因此可能需要$(@el)
。