Dla następującego kodu, zdarzenie {X0}} związane w widoku wystąpił dwa razy (więcej, jeśli dodasz więcej elementów do kolekcji jednocześnie).

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' });
});​

Jeśli zamiast dodawać tablicę do kolekcji, po prostu przekazujesz kilka obiektów jako argumenty (zasadniczo wyjmuj wsporniki kwadratowe), wydarzenie wystarczy tylko raz.

Czy jest to dzięki projektowi i istnieje sposób na zastąpienie tego zachowania bez przechodzenia { silent : true } jako opcji?

4
Radu 16 sierpień 2012, 02:40

2 odpowiedzi

Najlepsza odpowiedź

Zdarzenie add jest zwolnione raz na każdy model dodany.

Collection.add może zająć tablicę modeli lub pojedynczego modelu i niektórych opcji.

W powyższym przykładzie przechodzisz w tablicę dwóch modeli

Po przejściu w kilku obiektach, backbone uważa, że pierwszym obiektem jest model, a drugi to skróć opcji. Oznacza to, że tylko jeden model jest dodawany, więc wystrzeliwuje raz wydarzenie add.

3
jergason 15 sierpień 2012, 22:51

Przykro mi wskrzesić to pytanie od zmarłych, ale też miałem ten problem i chciałem pisać, jak go rozwiązałem. Problem z posiadaniem 'add' wyzwalacza tyle razy dla mnie było dlatego, że miałem złożoną funkcję renderowania moim zdaniem, który słuchał 'add'. To powodowało poważne problemy z wydajnością.

Rozwiązałem go, tworząc tymczasową kolekcję za pomocą przydatnej metody szkieletowej {X0}}, dodając do niego nowe modele, a następnie resetowanie oryginalnej kolekcji za pomocą obiektu TEMP Collection {X1}}. Kod wygląda tak:

// 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');

To ustawia tylko jeden wydarzenie 'change' zamiast zdarzeń {x1}}.

1
brokethebuildagain 31 maj 2013, 17:48