我有一个使用dojo/request
向服务器提交各种请求的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
,或者直接定位request
,并且在检查xhr
时它唯一可见的功能。
我甚至在绝望中回到了文档页面,并尝试使用方法dojo
定位"xhr"
以查看是否偶然无法在内部调用,但没有任何效果。
是否有一些我忽略的显而易见的东西?
修改
我尝试修改我的代码,以便针对this
和常用函数执行before建议。
类似于:aspect.before(this, "theFrequentlyUsedFunction",
这开箱即用,这意味着我可以使用繁琐的解决方法并为每个调用before
的函数添加request
建议,假设前面的语句的时间复杂度request
调用这些函数是微不足道的。
到目前为止,我的结论是,在Dojo request
调用之前应用建议时,我没有引用正确的目标和函数名称,但我仍然感到困惑,因为这不起作用。
答案 0 :(得分:2)
在您的情况下,“request”不是“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");
});
}
......
});
});