2012-02-19 18 views
17

モデルやDOMで何か変更されていないbackbone.jsの "イベント"を発生させる方法を見つけたいと思います。Backbone.jsのViewイベントを呼び出す

例えばFacebook SDKを非同期に読み込んでいます。私はauth.loginイベントを購読しており、ユーザーがログインしているビューにメッセージを送信して、自分自身を適切に再レンダリングできるようにしたいと考えています。

私の見解は次のようになります。私のFacebookのコードで

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

、私はこれを実行します。

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方法を見ることができません。スクリプトが正しい順序でロードされていることを確認しました。不思議なことに、別のViewオブジェクトでも同じコードが同じページにあり、うまく動作します。私はこれを説明する違いを見ていない。

より良い解決策は、何らかの種類のイベントを発生させ、その見解を聞くことです。しかし、signedRequestはモデルのプロパティであってはならないため、モデル上でchangeイベントを利用したくありません。これを達成するより良い方法はありますか?

+2

まあ、 '.trigger()'メソッドがあります。後でトリガーするカスタムイベントを視聴することができます。 –

答えて

28

Backbone.Viewは、ビュー上のメソッドを見ることができない理由を私は知りませんが、簡単にカスタムイベントをトリガし、あなたが

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

を好きなデータ渡すことができることを意味Backbone.Eventsで拡張された - それはすべき仕事 - 100%あなたは正しくビューをインスタンス化していますか? window.viewCreateItemViewのインスタンスですか?

10

あなたはモデルの外に、あなたは次のことを行うことができ、あなたのビューのイベントをサブスクライブすることを行いたい場合は、次の

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

その後、あなたはSomeObjectの

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

上のイベントを購読することができますまたはイベントをトリガーする

SomeObject.trigger('myevent', data); 
関連する問題