2012-12-31 67 views
0

型號:entry.js.coffeeBackbone.js的+ CoffeeScript的 - 等待Ajax來完成

class Raffler.Models.Entry extends Backbone.Model 

    url: '/api/entries/12345' 

路由器:entries_router.js.cofee

routes: 
'entries/:id': 'show' 

show: (id) -> 
    @model = new Raffler.Models.Entry() 
    @model.fetch() 
    view1 = new Raffler.Views.Profile(model: @model) 
    $("#profile_container").html(view1.render().el) 

查看:profile.js.coffee

class Raffler.Views.Profile extends Backbone.View 
    template: JST['entries/profile'] 

render: -> 
    $(@el).html(@template(entry: @model)) 
    this 

模板:profile.jst.eco

<div class="profile_desc"> 
    <table> 
    <tr> 
     <td valign="top" class="desc_heading">about: </td> 
     <td> 
     <%= @model.get('aboutMe') %> 
     </td> 
    </tr> 
    </table> 
</div> 

JSON響應:

{"aboutMe":"I am a proud Ruby Developer} 

我可以看到Ajax調用獲取數據。但我想它在之前渲染視圖文件。

得到了在Firebug的錯誤:

TypeError: this.model is undefined 
    __out.push(__sanitize(this.model.get('aboutMe'))); 

我如何可以等待模型Ajax來完成?

+0

編輯並添加了視圖,模板,響應。是的,它的編譯和拋出錯誤 –

回答

1

取之前,您必須指定回調函數,這樣的事情:

show: (id) -> 
    @model = new Raffler.Models.Entry() 
    @model.on 'sync', => @create_profile_view @model 
    @model.fetch() 

create_profile_view: (model) -> 
    view1 = new Raffler.Views.Profile(model: model) 
    $("#profile_container").html(view1.render().el) 

您可以使用您希望不同的事件(http://backbonejs.org/#Events)。

P.S.我更喜歡提取渲染邏輯和提取查看。

+0

錯誤是由於這個:我做了@ model.get('aboutMe')而不是@ entry.get('aboutMe')..而且這個Sync像一個魅力工作。謝謝! –