2012-04-08 96 views
0

我對骨幹js有一些困難。目前,我有一個通過json向骨幹網提供信息的rails應用程序。看起來,這是所有功能都正確,因爲當我瀏覽到URL時,顯示json數據。我在使用提取方法時遇到了困難。下面是我的代碼:骨幹js模型/控制器分配json數據到變量

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 

回答

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中,使用fat arrow (=>)代替。
  2. 視圖上的model屬性應按每個實例設置爲一個模型(因此@event - >@model名稱更改)。集合在類定義中獲取其model屬性,集合的@model應該是模型類。
  3. 綁定到模型上的"change"事件意味着,你的觀點將被通知(即@render將被調用)每當改變模型,這個事件的行爲是有點骨幹,所以你應該使用它的整點, per-fetch成功和錯誤處理程序更多用於錯誤處理和向用戶報告成功。
  4. 你真的應該關閉你的<span>元素。
  5. 視圖已經有@$el所以你可以使用它來代替$(@el)
  6. 您可以使用el: 'body'而不是el: $ 'body',並將jQueryification保留爲Backbone。
  7. 如果你使用的是老骨幹然後:
    1. 您可能需要使用bind,而不是on
    2. 您可能沒有@$el,因此可能需要$(@el)
+0

我真的很感謝這個詳細的答案。非常感謝! – Kyle 2012-04-27 12:42:13

1

在骨幹文檔看看:http://documentcloud.github.com/backbone/#Model-fetch

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

你應該設定爲取方法的成功和錯誤的方法。當你獲得成功事件時,你可以調用render()。