1

私は次のことをしようとしています:

  1. サーバーからデータをフェッチする
  2. ビューに通知される前に、モデルにゼロベースのインデックスを追加します
  3. 最後に実行すると、ビューに対して「レンダリング」イベントが発生します

コレクションで成功コールバックを使用してこれを実行しようとしていました

前に見る

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)

願わくば、このパターンが将来の誰かの検索に役立つことを願っています。

4

3 に答える 3

3

元の質問に解決策を既に投稿しましたが、回答として正式に投稿すると思いました:

よりクリーンなソリューションでは、ビューが汚い作業を行う必要はなく、カスタム イベントも必要ありません。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)

願わくば、このパターンが将来の誰かの検索に役立つことを願っています。

于 2013-03-15T20:52:50.193 に答える
1

インデックスは実際にはモデルレコード自体の一部ではないため、ビューはモデルとそのインデックスの両方をコレクションとは別に取得する必要があります。そこにあるコールバック関数がパラメーターとして取得するので、ビューを使用collection.eachしてモデルをループしてみてくださいmodel, index, collection。ビューは、単一のモデル以上のものをテンプレートに渡すことができることを忘れないでください。

class CollectionView1 extends Backbone.View
  render: =>
    $el = @$el
    $el.empty()
    @collection.each (model, index) ->
      modelView = new ModelView1 {model, index}
      $el.append modelView.render().el
    return this
于 2013-03-13T02:01:02.297 に答える