2012-02-19 19 views
17

Me gustaría encontrar una manera de plantear un "evento" de backbone.js sin que algo haya cambiado en el modelo o en el dom.Levantando un Backbone.js Ver el evento

Por ejemplo, estoy cargando el SDK de Facebook de forma asincrónica. Estoy suscrito al evento auth.login y me gustaría enviar un mensaje a mi punto de vista de que el usuario ha iniciado sesión para que pueda volver a renderizarse correctamente.

Mi punto de vista es similar a esto:

window.CreateItemView = Backbone.View.extend({ 
    el: $('#content'), 
    initialize: function() { 
    this.render(); 
    }, 
    render: function() { 
    // do something 
    return this; 
    }, 
    setSignedRequest: function(signedRequest) { 
    //do something with signedRequest 
    } 
}); 

En mi código de facebook, hago esto:

FB.Event.subscribe('auth.login', function(response){ 
    if (response.status === 'connected') { 
     var uid = response.authResponse.userID; 
     var accessToken = response.authResponse.accessToken; 
     window.signedRequest = response.authResponse.signedRequest; 

     if (window.view && window.view.setSignedRequest) { 
      window.view.setSignedRequest(window.signedRequest); 
     } 
    } 
    }); 

Sin embargo, aunque existe window.view, no puede ver el método setSignedRequest. Me he asegurado de que mis scripts se carguen en el orden correcto. Curiosamente, tengo este mismo código en una página diferente, aunque sea un objeto de vista diferente y funciona bien. No he visto ninguna diferencia que explicaría esto.

Una mejor solución sería levantar algún tipo de evento y tener la vista para escucharlo. Sin embargo, no deseo utilizar el evento de cambio en el modelo ya que signedRequest no debe ser una propiedad del modelo. ¿Hay una mejor manera de lograr esto?

+2

Bueno, existe el método '.trigger()'. Podrías hacer que tu vista escuche un evento personalizado, que dispararías más tarde ... –

Respuesta

28

Backbone.View se amplía con Backbone.Events que significa que puede fácilmente desencadenar eventos personalizados y pasar todos los datos que desea

var View = Backbone.View.extend({ 

    initialize: function() { 

     this.on('customEvent', this.doSomething, this); 
    } 

    doSomething: function(someData) { 

     // this! 
    } 
}); 

var view = new View(); 

view.trigger('customEvent', "someDataHere"); 

aunque no sé por qué no puede ver el método en la vista - que debería trabajo - ¿Estás 100% seguro de que estás instanciando la vista correctamente? y que window.view es una instancia de CreateItemView?

10

Si usted quiere hacer que fuera su modelo y suscribirse al evento en su vista que podría hacer lo siguiente:

var SomeObject = {...}; 
_.extend(SomeObject, Backbone.Events); 

A continuación, puede suscribirse a los eventos en SomeObject

SomeObject.on('myevent', someFunc, this); 

o activar el evento

SomeObject.trigger('myevent', data); 
Cuestiones relacionadas