2012-03-20 1 views
0

jquery.AOPを使用してバックボーン関数を呼び出すことができませんでした。グローバル関数とjavascriptモジュールでうまく動作します。jquery.aopでBackbone.js関数を呼び出しているときにスコープが発生する

require(['app', 'jquery' ], 
    function(App, $) {  
    App.initialize(); 
    $.aop.before({target: App.appRouter 
       method: 'helloWorld'}, 
      function() { 
       alert("before Hello World"); 
       } 
});  

私の例では、app.appRouterは確実に生きているインスタンス変数です。 ここで、アプリケーションはそのappRouterである:

define([ 
'jquery', 
'underscore', 
'backbone' 
], function($, 
     _, 
    Backbone 
    ){ 

var appRouter = Backbone.Router.extend({ 
    initialize: function() { 
     //some code 
    }, 
    helloWorld: function(){ 
       alert("hello world"); 
     } 

}); 


var initialize = function(){ 
    this.appRouter = new appRouter(this); 
    Backbone.history.start(); 

}; 


return { 
     initialize: initialize, 
     appRouter : this.appRouter 

}。 });

beforeアドバイスには決して行きませんので、スコープの問題のようです。 ご意見ありがとうございます。 ジミー

答えて

0

タイミングの問題が考えられます。

$ .aopは、ターゲット関数を新しい関数に置き換え、元のターゲットへの参照を維持することによって動作します。関数を呼び出すと、その関数のバージョンが実行され、元の関数が呼び出されます。


$.aop.before({ 
    target: App.appRouter 
    method: 'helloWorld'}, 
    function() { 
    alert("before Hello World"); 

}); 
App.initialize(); 

私の他の考えは、私は、ルータのhelloWorldメソッドを呼び出しているコード内の任意の場所が表示されないということです:$.aop...呼び出しでApp.initialize()コールを交換してみてください、ということを考えると

。実際にそれを呼んでいると確信していますか?

+0

私は両方の呼び出しを無駄に交換しようとしました。また、リンクがクリックされて、Backboneルーターのルートにつながって、triggerオプションがtrueに設定されていると、この機能が呼び出されます。これはjquery.aopがそれを呼び出せない理由です。しかし、App.appRouter.helloWorld関数は、デバッグ中にFirebugによくあります。 –

+0

最後のアイデアは、あなたのルータに正しく定義されたルートがありますか?あなたが投稿したコードに実際のルート:{...}を表示しません。経路が定義されていない場合、ルータは何もしません。 ...それが明白であれば申し訳ありませんが、私は投稿で見ているものを外しています –

+0

バックボーンルータは経路、イベントで正しく書かれています...しかし、私は何かを発見しました:$ .aop.before({target:App。 appRouterメソッド: ''}、function(){alert( "before Hello World");}); appRouterのすべての関数が正しく呼び出されます!aop.beforeブロック内でターゲットとメソッドを動的に取得する方法はありますか?それは最終的に私が呼び出し元 –

関連する問題