次のようなメモコレクションの追加イベントにバインドするバックボーン ビューがあります(CoffeeScript を使用):
initialize: () ->
@options.notes.bind('add', @noteAdded)
そして、最近作成されたメモを DOM に追加するために呼び出される noteAdded メソッドと addOneNote メソッドを次に示します。
addOneNote: (note) =>
view = new CrmBliss.Views.Consultants.NoteView({model: note})
@$(".past_notes").prepend view.render().el
noteAdded: (model, response) =>
console.debug 'model', model.toJSON()
@addOneNote(model)
最後に、コレクションでcreateメソッドを呼び出す方法を次に示します。
saveNote: (e) =>
id = @model.get('id')
body = @$('.note-body').val()
@options.notes.create({ body: body, consultant_id: id })
データベースに追加されたものを反映するモデルでnoteAddedが呼び出されることを期待していました。モデルに対して返されるフィールドがいくつかありますが、これらはクライアントによって挿入されず、サーバーによって計算されます。つまり、created_atとuser_nameはサーバーによって返されるメソッドですが、クライアントはサーバーからフェッチする前に認識していません。
したがって、次の (eco) テンプレートをレンダリングしようとすると:
<div class="note">
<span class="date"><%= @created_at %></span>
by
<span class="taker"><%= @user_name %></span>
<div class="note_body">
<%= @body %>
</div>
</div>
本文のみがレンダリングされます (メモの作成に使用されたオブジェクトには既に body 属性があるため)。
メモを挿入する前に少し待つようにnoteAddedメソッドを変更すると、次のように機能します。
noteAdded: (model, response) =>
console.debug 'note before', model.toJSON()
console.debug 'model', model
attrShow = =>
console.debug 'after time', model.toJSON()
@addOneNote(model)
setTimeout(attrShow, 1000)
これにより、明らかに間違ったイベントにバインドしていること、およびモデルがサーバーからロードされたときに呼び出されるイベントにバインドする必要があることがわかります。
呼び出されたときに、正しい (そして最終的な) モデル プロパティを持つイベントにバインドする必要があるのはどれですか?