0

私はbackbone.jsコレクションとコレクションビューを持っています。そのコレクションを聞くコレクションビューaddイベント。しかし、コレクションに新しいモデルを追加すると、モデルごとに複数の時間がレンダリングされます。 JSFiddleBackbone.jsコレクションビューは単一のトリガーで複数回レンダリングされます

var ImageCollectioView = Backbone.View.extend({ 

    initialize: function() { 
    this.collection.bind('add', this.render, this); 
    }, 

    collection: imgColection, 
    el: '#cont', 
    render: function() { 
    var els = [], self = this; 
    this.collection.each(function(image){ 
     var imageView = new ImageView({model: image}); 
     self.$el.append(imageView.render().el); 
    }); 

    return this; 
    } 
}); 

答えて

2

を確認してくださいあなたのrender方法は、コレクション全体をレンダリングします。だから、モデルを追加した後は、既存のアイテムのビューをクリアする必要があります。

render: function() { 
    var els = [], self = this; 
    this.$el.empty(); 
    //------^---- clear existing 
    this.collection.each(function(image){ 
     var imageView = new ImageView({model: image}); 
     self.$el.append(imageView.render().el); 
    }); 

    return this; 
} 

言われて、それだけではなく、コレクション全体をレンダリングするよりも、単一のアイテムビューを追加する別の方法を追加することをお勧めだと:

var ImageCollectioView = Backbone.View.extend({ 
    initialize: function() { 
    this.render(); 
    this.listenTo(this.collection, 'add', this.renderItem); 
    }, 
    el: '#cont', 
    render: function() { 
    this.collection.each(this.renderItem, this); 
    return this; 
    }, 
    renderItem: function(image) { 
    var imageView = new ImageView({ 
     model: image 
    }); 
    this.$el.append(imageView.el); 
    } 
}); 

Updated Fiddle

+0

私はそれを逃しました、その作業は今、もう一つの助けが私のバックボーンのコーディングパターンは大丈夫か間違っていますか? –

+0

@WimalWeerawansaあなたのコードは改善されていますが、問題はありません。 https://jsfiddle.net/rfzqtyru/10/を参照してください。主なことは、ビューコンストラクタ内でモデル/コレクションインスタンスをハードコーディングするべきではないということです。それらを外側に作成し、オプションとして渡すか、ビューの内側に作成します。もう一つは、手動でモデルを初期化する必要はありません。 –

+0

もう一度ご協力いただきありがとうございます。 –

関連する問題