2012-05-14 12 views
5

Tengo una configuración muy simple ...Backbone.js Sync no está desencadenando ningún evento en el modelo

Una ruta es la configuración que llama a un diálogo modal usando bootstrap. El headerView llama a un método cuando se hace clic en un menú -

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

En el MyView que llamo se unen en el inicializar

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

Y llama Backbone.sync en un evento de clic de botón:

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

Se llama la alerta dentro de la sincronización ... pero nunca se llama a la alerta en el comando de enlace en la inicialización. Intenté mover el enlace dentro del modelo, moverlo, también intenté sincronizar: fallar, sincronizar: hecho. Sin éxito.

+0

Sobrescribir el 'Backbone.sync' es complicado, y se ve raro llamarlo directamente .. ¿Por qué no utiliza los comandos de capa alta como' Model.fetch() '? – fguillen

Respuesta

4

No todo caso se desencadena debido a que no lo dice. Está pasando devoluciones explícitas success y error que son las que tienen que estar a cargo de desencadenar los eventos.

Los nativos Backbone.sync llamadas de la capa de alta comandos como save, create, fetch reciben successerror y devoluciones de llamada de los desencadenan los acontecimientos, sino que están utilizando su propio así que este comportamiento se obvia nativa.

Para example in the Model.save, in the Model.destroy y así sucesivamente.

Pero, como dije en un comentario anterior, realmente debería pensar si realmente necesita llamar al Backbone.sync directamente en lugar de usar métodos de capas más altas como Model.fetch().

2

tratar de implementar la Backbone.sync así:

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); 
}; 
Cuestiones relacionadas