2012-02-15 5 views
8

せずにコレクションに要素を追加します。ビューの初期化子でBACKBONE.JS:私はコレクションから自分自身をレンダリングビュー持って再レンダリングするすべてのコレクション

render: function() { 

    $(this.el).html(JST['templates/menu']({collection: this.collection })); 
    $('#nav').html(this.el);  
} 

を、私はのaddイベントをバインドビューのレンダリング機能に関するコレクション:

initialize: function() { 
    this.render(); 
    var self = this; 
    this.collection.bind("add", function(event){ 
     self.render(); 
    }); 
} 

他の場所でアプリケーションにアイテムを追加します。

bookSubscription_collection.add(model); 

私は、コレクション内のすべての項目が再描画され、その後、コレクションに新しい項目を追加する場合、そのコードの問題は、あります。

他のすべてのアイテムを再レンダリングせずに新しいアイテムをコレクションに追加する方法はありますか?新しいアイテムをレンダリングするだけですか?

答えて

3

コレクションのaddイベントをレンダリング関数にバインドする代わりに、追加されたモデルを受け入れる他の関数にバインドし、追加されたモデルのデータでDOMを変更します。

+0

ありがとう、私は今夜を試してみましょうだと思います! –

4

これは私がやっている方法の簡略版です。 resetはすべてのモデルをUIに追加し、addはUIに単一のモデルを追加します。 addAllには、基本的に、モデルごとにaddOneを呼び出すループがあります。それはおそらく最適化される可能性がありますが、十分に機能します。

initialize: function() { 
    _.bindAll(this, 'render', 'addOne', 'addAll'); 

    leads.bind('add', this.addOne, this); 
    leads.bind('reset', this.addAll, this); 
    }, 
    render: function() { 
    this.addAll(); 
    return this; 
    }, 
    addOne: function(model) { 
    // add the model to HTML 
    }, 
    addAll: function(options) { 
    leads.each(this.addOne); 
    return this; 
    } 
+0

ieを追加した場合、実際のHTML注入が1回呼び出されるような改善があります。 10モデル? –

0

アブラハムは良い例を書いています。アイブ氏はまた、この

initialize: ->  
    self = @ 
    @model.bind "add", (task) -> 
    $(self.el).append new app.TaskIndexItemView(model: task).render().el 

のようにそれを使用してきたが、私はaddOneがよりよい解決策

+1

なぜ 'self = @'ですか?それがなければ同じで、束縛スコープのために太い矢印=>を使うべきです。 '$(self.el)'を実行する代わりに '$(@ el)'を実行するか、あるいはバックボーン0.9+を使っているなら ' @ $ el'は 'this.el'のキャッシュされたjQueryラップされたインスタンスを使用します –

関連する問題