2013-05-14 9 views
9

Jest nowy zachowanie w najnowszej wersji (1.0.0 Backbone w którym zdarzenie resetowania nie jest wyzwalane domyślnie po pobraniu kolekcji.wykryć, kiedy zbiór kręgosłup zostały pobrane (Backbone 1.0.0)

http://backbonejs.org/#changelog

„update” przemianowany Collection ustanawiają dla równoległości z podobnym model.set(), a kontrast z resetem. To teraz domyślnym mechanizmem aktualizowania po sprowadzić. Jeśli chcesz Kontynuuj używanie "reset", przekazać {reset: true}.

Problemem jest to, że chcę, aby przechwycić zdarzenie, gdy zbiór został ostatecznie naciągane (dość częsty przypadek, naprawdę!)

mogłem słuchać dodawać, usuwać i zmieniać zdarzenia, ale jeśli kolekcja jest pusty Nie wiem, jak złapać to wydarzenie.

Jaki byłby nowy, zalecany sposób przechwytywania po sfinalizowaniu żądania odbioru, czy też przekazanie {reset = true} jest jedynym sposobem, aby to osiągnąć?

ps: oto oryginalne pytanie, BTW can't catch Backbone Collection reset event

Odpowiedz

22

Od Backbone.sync doc,

Ilekroć model lub kolekcja zaczyna synchronizację z serwerem, "prośba" zdarzenie jest emitowany. Jeśli żądanie zakończy się pomyślnie , otrzymasz zdarzenie "synchronizacji" i "błąd", jeśli nie.

Na przykład

var C = Backbone.Collection.extend({ 
    url: '/echo/json/' 
}); 

var c = new C(); 
c.on('sync', function() { 
    console.log('sync'); 
}); 
c.fetch(); 

A demo http://jsfiddle.net/nikoshr/GLATm/

+0

tak, to co szukałem – opensas

10

Możemy przekazać metodę jako przewodnika sukces kiedy nazywamy fetch na gromadzenie i jak powiedział po prostu chcesz coś zrobić, gdy wszystko [dodaj, usuń, zaktualizuj lub zresetuj] stało się, możesz zrobić wewnątrz tej funkcji obsługi sukcesu.

collection.fetch({ 
    success: function() { 
    // Do Something 
    // This is called when all add, remove and update operations have been done 
    } 
}); 

Uwaga: procedura obsługi sukcesu jest zawsze wykonywana bez względu na to, czy minął numer reset:true, czy nie. Niezależnie od tego, czy twoja kolekcja zostanie opróżniona, czy nie, zostanie ona wywołana w ostatnim kroku, kiedy nastąpiły wszystkie zdarzenia dodawania, usuwania i aktualizacji.

Daj mi znać, jeśli to nie rozwiąże problemu.

0

Moje własne rozwiązanie jest naprawdę proste. Mam już BaseCollection z dodanymi funkcjami, więc tam właśnie ustawiłem jako domyślny {reset: true}. Kod powinien być mniej więcej tak (mój własny BaseCollection ma wiele rzeczy, które nie jest istotne tutaj):

var BaseCollection = Backbone.Collection.extend({ 
    fetch: function(options) { 
    options = options || {}; 
    options.reset = (options.reset === undefined ? true : options.reset); 
    // just call super.fetch 
    return Backbone.Collection.fetch.call(this, options); 
    }; 
});  
0

Korzystanie obietnice ...

// you could use promises as well 
// P.S.: pardon jquery promises :) 

var C = Backbone.Collection.extend({ 
    url: '/echo/json/' 
}); 

var c = new C(); 

// c.fetch() returns jqXHR object that you can listen too 
$.when(c.fetch()) 
    .done(successFn) 
    .fail(failFn) 
    .always(alwaysFn); 
Powiązane problemy