2

我有一個Rails項目,其中包含Backbone.js和HAML作爲客戶端模板語言。Backbone.js Collection.models不能正常工作

在文件app /資產/視圖/ meeting.coffee

class window.MeetingIndex extends Backbone.View 

    template: JST['meeting/index'] 

    render: -> 
    @collection.fetch() 
    @$el.html(@template(collection: @collection)) 
    this 
在文件app /資產/ Java腳本/模板/會議

/index.hamlc

- console.log(@collection.length) # prints 0 in console 
- console.log(@collection.models) # prints [] in console 
- console.log(@collection.at(0)) # prints undefined in console 
- window.x = @collection 

如果我去了瀏覽器控制檯,我得到:

x.length # returns 2 
x.models # returns [Meeting, Meeting] 
x.at(0) # returns Meeting object 

如果我能訪問.hamlc文件@collection變量,因爲我是在分配給獲勝dow.x.爲什麼我無法從.hamlc文件訪問@collection項目?

我需要這樣的東西

- for model in @collection.models 
    %p= model.get('landlord_id') 
    %p= model.get('tenant_id') 
    %p= model.get('at') 

工作

回答

3

Collection#fetch方法是異步的(即它是幕後AJAX調用),所以@collection.fetch()還沒有從服務器,當你得到任何東西嘗試在您的視圖中使用它。但是:

選項散列接受successerror回調將被傳遞(collection, response)作爲參數。當模型數據從服務器返回時,集合將重置。

所以,你可以使用回調:

render: -> 
    @collection.fetch(
    success: (collection, response) => 
     @$el.html(@template(collection: @collection)) 
    @ 

或者你可以綁定視圖的render到集合的reset事件:

class window.MeetingIndex extends Backbone.View 
    template: JST['meeting/index'] 
    initialize: -> 
    @collection.on('reset', @render) 
    @collection.fetch() 
    render: => 
    @$el.html(@template(collection: @collection)) 
    @ 

然後fetch調用視圖的initialize會間接當從服務器獲取某些內容時觸發正確的render調用。如果你的模板知道如何處理一個空集合,這種方法效果最好,也許它可以檢測到一個空集合並顯示「加載」消息,或者只是說「這裏沒有東西」。