2012-02-19 18 views
17

Chciałbym znaleźć sposób na podniesienie "zdarzenia" backbone.js bez jakiejkolwiek zmiany w modelu lub w domenie.Podnoszenie kręgosłupa.js Zobacz wydarzenie

Na przykład ładuję pakiet SDK Facebooka asynchronicznie. Jestem subskrybentem zdarzenia auth.login i chciałbym wysłać wiadomość do mojego widoku, że użytkownik jest zalogowany, aby mógł ponownie renderować się poprawnie.

Moim zdaniem wygląda podobnie do tego:

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

W moim kodu facebook, robię to:

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

Jednak podczas window.view istnieje, nie może zobaczyć setSignedRequest metody. Upewniłem się, że moje skrypty ładują się we właściwej kolejności. O dziwo, mam ten sam kod na innej stronie, ale inny obiekt View i działa dobrze. Nie widziałem żadnej różnicy, która by to wyjaśniała.

Lepszym rozwiązaniem byłoby podniesienie jakiegoś zdarzenia i sprawdzenie go w widoku. Jednak nie chcę używać zdarzenia zmiany w modelu, ponieważ wartość signedRequest nie powinna być własnością modelu. Czy istnieje lepszy sposób na osiągnięcie tego?

+2

Cóż, istnieje metoda '.trigger()'. Możesz sprawić, że Twój widok będzie odsłuchiwał niestandardowe wydarzenie, które wyzwolisz później ... –

Odpowiedz

28

Backbone.View jest wydłużany Backbone.Events który oznacza, że ​​można łatwo wywołać zdarzenia niestandardowe dane i przekazać cokolwiek chcesz

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

choć nie wiem, dlaczego nie widać sposobu na widoku - to powinno praca - Czy jesteś w 100% pewien, że poprawnie tworzysz widok? i że window.view jest instancją CreateItemView?

10

Jeśli chcesz to zrobić na zewnątrz modelu i zapisz się na razie na widoku można wykonać następujące czynności:

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

Następnie można zapisać się do wydarzeń na SomeObject

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

lub wywołaj zdarzenie