2012-02-19 79 views
17

我想找到一種方法來提升backbone.js「事件」,而不需要在模型或dom中進行任何更改。提高Backbone.js查看事件

例如,我正在異步加載Facebook SDK。我訂閱了auth.login事件,並想發送消息給我的視圖,即用戶已登錄,因此可以適當地重新呈現自己。

我的觀點看起來與此類似:

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

在我的facebook代碼,我這樣做:

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

然而,儘管window.view存在,它無法看到setSignedRequest方法。我確保我的腳本按正確順序加載。奇怪的是,我有不同的頁面上的這個相同的代碼,儘管它是一個不同的視圖對象,它工作正常。我沒有看到任何可以解釋這一點的差異。

更好的解決辦法是提出某種事件並讓視圖監聽它。但是,我不想在模型上使用更改事件,因爲signedRequest不應該是模型的屬性。有沒有更好的方法來完成這個?

+2

那麼,有'.trigger()'方法。您可以讓您的視圖聽取自定義事件,稍後您可以觸發該事件... – 2012-02-19 16:07:53

回答

28

Backbone.ViewBackbone.Events擴展,這意味着你可以輕鬆地觸發自定義事件,並通過你想

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

任何數據,儘管我不知道爲什麼你不能看到該視圖的方法 - 它應該工作 - 你100%確定你正確地實例化視圖?那window.viewCreateItemView的實例嗎?

10

如果你想這樣做,你的模型之外,並訂閱你的看法的情況下,你可以做到以下幾點:

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

然後,您可以訂閱事件的SomeObject

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

或觸發事件

SomeObject.trigger('myevent', data);