0

モデル:entry.js.coffee

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が完了するのをどのように待つことができますか?

4

1 に答える 1

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)。

PS私は表示するためにレンダリングロジックを抽出してフェッチすることを好みます。

于 2012-12-31T09:07:19.383 に答える