2017-12-04 105 views
0

dojo/requestを使用してサーバーにさまざまな要求を送信するDojoクラスがあります。Dojo要求で作業しない前のDojoアスペクト

dojo/aspectを使用して、を追加する必要があります。その前に、アドバイスを送信してください。

docsは比較的わかりやすいようです。私の問題は、前にアドバイスが実行されることはありませんということです

'myPackage/MyClass':function(){ 
    define("myPackage/MyClass", [ 
     "dojo/request", 
     // etc. etc. 
     "dojo/aspect" 
    ], function(request, ..., aspect) { 
     return declare("myPackage.MyClass", null, { 
      constructor: function(options){ 
       aspect.before(dojo, "request", 
        function(url, args){ 
         // TODO 
         alert("before advice applied"); 
        } 
       ); 
      }, 
      // various functions that use dojo request 
     }); 
    } 

); 
} 

私のクラス宣言は次のようになります。

私はそのようなthisを標的とする代わりにdojo、又は検査するとき、xhrを直接requestを標的とし、そののみ表示機能など、いくつかの変異体を、試してみました。

私は絶望的なドキュメントページに戻り、方法"xhr"dojoをターゲティングしようとしましたが、うまく内部的に呼び出すことはできませんでしたが、今まで働いたことはありません。

私は見落としたことがありますか?

編集

前にアドバイスをthisと使用頻度の高い機能をターゲットに実行されたように、私は自分のコードを変更してみました。

のような何か:この文の時間複雑性を仮定し、私は面倒な回避策を使用してrequestを呼び出す機能ごとにbeforeアドバイスを追加することができることを意味箱、外にうまく権利を働いたaspect.before(this, "theFrequentlyUsedFunction",

これらの関数の中のrequest呼び出しは簡単です。

Dojo requestが呼び出される前にアドバイスを適用するときに正しいターゲットと関数名を参照していないということですが、なぜこれが機能しないのかはまだ分かりません。

答えて

1

"リクエスト"は "dojo"オブジェクトのプロパティではありません。これは単に関数で渡される引数の名前です。したがって、モジュールのプロパティにも、オブジェクトの任意のプロパティに割り当てることができます。あなたは解決策に近づきました。私の例で見てみましょう:このソリューションの

define([ 
    "dojo/_base/declare", 
    ..... 
    "dojo/request", 
    "dojo/aspect" 
], function (
    declare, 
    ..... 
    request, 
    aspect 
) { 

    return declare("Test", [...], {    
     request: request, 
     constructor: function() { 
      aspect.before(this, "request", function() { 
       console.log("before advice applied"); 
      }); 
     } 
     ...... 
    }); 
}); 
+0

おかげで、それは非常に簡単だし、(明らかなの一種)で、動作します警告:あなたは、this.request' 'にrequest''へのコールをリファクタリングする必要がありますアドバイスを適用するための注文。 – Mena

+0

喜んで助けてください。残念ながら、 'request'が定義のファクトリ関数の範囲でのみ引数として存在するまでは、現時点で他の方法では動作しません。 –