2012-02-19 9 views
17

Mi piacerebbe trovare un modo per generare un "evento" backbone.js senza che qualcosa sia cambiato nel modello o nel dom.Raising a Backbone.js Visualizza evento

Ad esempio, sto caricando l'SDK di Facebook in modo asincrono. Sono iscritto all'evento auth.login e desidero inviare un messaggio alla mia vista che l'utente abbia effettuato l'accesso in modo da poter eseguire nuovamente il rendering in modo appropriato.

mio punto di vista è simile a questo:

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

Nel mio codice facebook, faccio questo:

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

Tuttavia, mentre esiste window.view, non può vedere il metodo setSignedRequest. Mi sono assicurato che i miei script stiano caricando nell'ordine corretto. Stranamente ho lo stesso codice su una pagina diversa anche se un oggetto View diverso e funziona perfettamente. Non ho visto alcuna differenza che spiegherebbe questo.

Una soluzione migliore sarebbe sollevare qualche tipo di evento e avere la vista di ascoltarlo. Tuttavia, non voglio utilizzare l'evento change sul modello poiché la richiesta firmata non deve essere una proprietà del modello. C'è un modo migliore per realizzare questo?

+2

Bene, c'è il metodo '.trigger()'. Puoi fare in modo che la tua vista ascolti un evento personalizzato, che avresti attivato in seguito ... –

risposta

28

Backbone.View si amplia con Backbone.Events che significa che si può facilmente innescare eventi personalizzati e trasmettere qualsiasi dato che si desidera

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"); 

anche se non so perché non si può vedere il metodo per la vista - dovrebbe lavoro - Sei sicuro al 100% di istanziare correttamente la visualizzazione? e che window.view è l'istanza di CreateItemView?

10

Se si vuole fare che al di fuori il vostro modello e sottoscrivere l'evento sulla vostra vista che si può fare come segue:

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

Quindi, è possibile iscriversi agli eventi sul SomeObject

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

o attivare l'evento

SomeObject.trigger('myevent', data); 
Problemi correlati