4

次のコードではadd、ビューにバインドされたイベントが2回発生します(コレクションに要素を一度に追加するとさらに発生します)。

http://jsfiddle.net/radu/GnG66/

App = window.App || {};

var Model = Backbone.Model.extend();
var Collection = Backbone.Collection.extend();
App.collection = new Collection({ model: Model });

var View = Backbone.View.extend({
    events: {
        'click': function() {
            console.log('click');
            App.collection.add([{
                foo: 'foo'
            }, {
                bar: 'bar'
            }]);
        }
    },
    initialize: function() {
        App.collection.on('add', function() {
            console.log('Something has been added to the collection')
        }, this);
    }
});

$(function() {
    App.view = new View({ el: '#test' });
});​

コレクションに配列を追加する代わりに、引数として複数のオブジェクトを渡すだけの場合(基本的には角かっこを削除するだけ)、イベントは1回だけ発生します。

{ silent : true }これは仕様によるものであり、オプションとして渡さずにこの動作をオーバーライドする方法はありますか?

4

2 に答える 2

3

イベントは、add追加されたモデルごとに1回発生します。

Collection.addモデルの配列、または単一のモデルといくつかのオプションを取ることができます。

上記の例では、2つのモデルの配列を渡します。addイベントは、追加されたモデルごとに1回発生するため、2回発生します。

複数のオブジェクトを渡すと、Backboneは最初のオブジェクトがモデルであり、2番目のオブジェクトがオプションのハッシュであると見なします。つまり、モデルが1つだけ追加されているため、addイベントが1回発生します。

于 2012-08-15T22:51:40.757 に答える
1

この質問を死者の中から復活させて申し訳ありませんが、私もこの問題を抱えていたので、どのように解決したかを投稿したいと思いました。トリガーを何度も使用することの問題'add'は、ビューにリッスンしている複雑なレンダリング関数があったため'add'です。これは深刻なパフォーマンスの問題を引き起こしていました。

バックボーンの便利なcollection.clone()メソッドを使用して一時コレクションを作成し、それに新しいモデルを追加してから、一時コレクションのmodelsプロパティを使用して元のコレクションをリセットすることで、問題を解決しました。コードは次のようになります。

// Create a temporary copy of searchResults
var temp = App.searchResults.clone();

// Add the new results
temp.add(newResults.models);

// Copy the new data over the old data
App.searchResults.reset(temp.models);

// Added this since reset triggers 'reset' and my view is listening for 'change add remove'
this.get('filtered_flights').trigger('change');

これ'change'により、複数の'add'イベントではなく、1つのイベントのみが発生します。

于 2013-05-31T17:48:39.363 に答える