2012-05-14 16 views
5

Ich habe eine sehr einfache Einrichtung ...Backbone.js Sync löst keine Ereignisse auf dem Modell

Eine Route ist Setup, die einen modalen Dialog mit Bootstrap aufruft. Die headerView ruft eine Methode, wenn ein Menü angeklickt wird -

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

Im MyView Ich bind in den Anruf

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

initialisieren und rufen Backbone.sync in eine Schaltfläche klicken Ereignis:

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

Die Warnung innerhalb der Synchronisierung wird aufgerufen ... aber die Warnung im Befehl bind in der Initialisierung wird nie aufgerufen. Versucht, die Bindung innerhalb des Modells zu verschieben, es zu verschieben, versuchte auch sync: fail, sync: done. Kein Erfolg.

+0

Das 'Backbone.sync' zu überschreiben ist knifflig und sieht komisch aus, es direkt aufzurufen. Warum benutzt du die high layer Befehle nicht als' Model.fetch() '? – fguillen

Antwort

4

Nicht jedes Ereignis ausgelöst wird, weil man nicht so gesagt. Sie übergeben explizite success und error Callbacks, die diejenigen sind, die für die Auslösung der Ereignisse zuständig sein müssen.

Die nativen Backbone.sync Anrufe von der hohen Schicht-Befehle wie save, create, fetch erhalten success und error Rückrufe diejenigen, die Ereignisse auslösen, aber Sie sind mit Ihrem eigenen so dieses nativen Verhalten vermieden wird.

Für example in the Model.save, in the Model.destroy und so weiter.

Aber, wie ich in einem früheren Kommentar gesagt habe, sollten Sie wirklich denken, wenn Sie wirklich direkt anrufen müssen, anstatt höhere Ebenen-Methoden wie Model.fetch() zu verwenden.

2

Versuchen Sie, die Backbone.sync wie folgt umzusetzen:

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); 
}; 
Verwandte Themen