2012-05-14 9 views
5

Mam bardzo prostą konfigurację ...backbone.js Sync nie powoduje żadnych wydarzeń na modelu

Trasa jest konfiguracja, która wywołuje modalne okno dialogowe za pomocą startowej. HeaderView wywołuje metodę, gdy kliknięciu menu -

menuClick: function(e){ 
    e.preventDefault(); 
    if (!this.myView) { 
     this.myView= new MyView({model: new MyModel()}); 
    } 
    this.myView.render(); 
}, 

W MyView nazywam wiążą w zainicjować

initialize: function(){ 
    this.model.bind('sync', function(model){ alert('test view')}); 
} 

I zadzwonić Backbone.sync w przypadku przycisk kliknij:

var response = Backbone.sync('read', this.model, { 
    success: function(data, textStatus, jqXHR) { alert('success'); }, 
    error: function(data, textStatus, jqXHR){ alert(fail); } 
}); 

Alarm wewnątrz synchronizacji zostanie wywołany ... ale alert w poleceniu bind w inicjalizacji nigdy nie zostanie wywołany. Próbowałem przesuwać bind wewnątrz modelu, wyprowadzać go, próbowałem także synchronizacji: fail, sync: done. Bez powodzenia.

+0

Zastąpienie 'Backbone.sync' jest trudne i wygląda dziwnie na bezpośrednie wywołanie .. Dlaczego nie używasz poleceń wysokiej warstwy jako' Model.fetch() '? – fguillen

Odpowiedz

4

Nie każde zdarzenie jest wyzwalany, ponieważ nie powiedzieć. Przekazujesz wyraźne wywołania zwrotne od success i error, które są odpowiedzialne za wywoływanie zdarzeń.

Rodzime Backbone.sync rozmowy z warstwy wyższej poleceń jako save, create, fetch otrzymać success i error Callbacki tych wyzwalać zdarzenia, ale używasz własnego więc rodzimy zachowanie jest zażegnane.

Dla example in the Model.save, in the Model.destroy i tak dalej.

Ale, jak już wspomniałem w poprzednim komentarzu, naprawdę powinieneś pomyśleć, czy naprawdę potrzebujesz zadzwonić pod numer Backbone.sync bezpośrednio, zamiast korzystać z metod wyższej warstwy, takich jak Model.fetch().

2

Spróbuj wdrożyć Backbone.sync tak:

var sync = Backbone.sync; 
Backbone.sync = function (method, model, options) { 
    var success = options.success; 
    options.success = function (resp, status, xhr) { 
     //Your logic goes here 
     console.log('succeed'); 
     if (success) success(resp, status, xhr); 
    }; 
    options.error = function (xhr, ajaxOptions, thrownError) { 
     console.log('failed'); 
    } 
    sync(method, model, options); 
}; 
Powiązane problemy