我有一个使用Dojo声明的对象(" ..."行表示我省略了代码,我认为这不是解释问题所必需的):
dojo.provide('communityWidgetClass');
dojo.declare('communityWidgetClass',null,{
...
postToTVService: function(svcType,postJson) {
try {
var svcPath;
switch (svcType) {
case this.SVC_REL: svcPath=insightConfig.relPath; break;
case this.SVC_MSG: svcPath=insightConfig.msgPath; break;
default: return;
}
this.consoleLog('communityWidget.postToTVService postJson',postJson);
this.startLoadingResults();
var args={
url:insightConfig.proxyPath+svcPath,
postData:postJson,
handleAs:'json',
preventCache:true,
load:function(data){
dojo.hitch(this,'xhrLoad',data,svcType);
},
error:function(error){
dojo.hitch(this,'xhrError',error);
}
};
var deferred=dojo.xhrPost(args);
} catch(err) {
this.consoleError('communityWidget.postToTVService',err);
}
},
...
xhrError: function(error) {
this.consoleError('xhrError',error);
},
xhrLoad: function(data,svcType) {
this.consoleLog('xhrLoad svc:'+svcType,data);
this.endLoadingResults();
}
});
dojo.xhrPost
内的postToTVService
调用会运行并检索所需的数据。我可以在Firebug" Net"中看到这个请求。标签
问题在于,args.load
或args.error
都没有调用他们应该调用的方法
我认为原因是dojo.hitch
仅在邮件请求返回后运行,之后应该运行,以便this
引用外部communityWidgetClass
对象。
但是,如果我之前致电dojo.hitch
,则data
和error
个对象(我需要传递给xhrLoad
和xhrError
)不存在
我已经看了几个关闭的例子,包括我几个月前为一个更简单的案例写的一个,但是无法弄清楚如何将它们应用到这个案例中。
如何使args.load
能够传递data
(仅存在于XHR帖子请求的末尾)和svcType
(仅在帖子请求之前存在) )communityWidgetClass.xhrLoad
方法的参数,与args.error
类似,将error
参数传递给communityWidgetClass.xhrError
?
可能更容易没有xhrLoad
和xhrError
方法,只需将他们的身体移到args.load
和args.error
内,但这些方法会更大完成后,我认为它们更容易阅读和维护args
对象之外的方法。
答案 0 :(得分:0)
您需要从hitch
仍具有预期值的范围中调用this
,而不是在已经搞砸了的回调中。
var args={
…,
load: dojo.hitch(this, function(data) {
// in this function, `this` is bound correctly - so we can call
this.xhrLoad(data, svcType);
}),
// alternatively, just "hitch" the method when the arguments match
error: dojo.hitch(this,'xhrError');
};