私は次のことをしようとしています:
- サーバーからデータをフェッチする
- ビューに通知される前に、モデルにゼロベースのインデックスを追加します
- 最後に実行すると、ビューに対して「レンダリング」イベントが発生します
コレクションで成功コールバックを使用してこれを実行しようとしていました
前に見る
initialize: () ->
@collection.on 'reset', @render, this
render: () -> ...render code...
コレクションの前に
search: () ->
@fetch {
success: @fetch_success
}
fetch_success: () ->
for i in [0...collection.models.length]
collection.models[i].set('go_index', i)
このようにすると、成功のコールバックによってコレクションが更新される前に、ビューが render イベントを発生させていました。私が思いついた解決策は、ビューにfetched
イベントをリッスンさせ、コレクションを正常に変更した後にコレクションを起動させることでした:
後に表示
initialize: () ->
@collection.on 'fetched', @render, this
render: () -> ...render code...
収集後
initialize: () ->
@on 'reset', @add_index_and_notify, this
add_index_and_notify: () ->
for i in [0...@models.length]
@models[i].set('go_index', i)
@trigger('fetched')
これはうまくいきます。これがこれを達成するための最もエレガントな方法なのか、それとも組み込みの方法が欠けているのか疑問に思っています。
3/15 更新
ビューが汚い仕事をする必要がなく、カスタムイベントを作成する必要がない、よりクリーンなソリューションを思いつきました。sync
トリックは、イベントをリッスンすることです(の後 reset
に発生します)
最終版を見る
initialize: () ->
@collection.on 'sync', @render, this
render: () -> ...render code...
コレクションファイナル
initialize: () ->
@on 'reset', @add_index, this
add_index: () ->
for i in [0...@models.length]
@models[i].set('go_index', i)
願わくば、このパターンが将来の誰かの検索に役立つことを願っています。