所以我在我的控制器名为Questionnaire.controller.js的onBeforeRendering方法中使用jQuery的promise接口调用我的xsjs,该方法被绑定以查看Questionnaire.view.xml
onBeforeRendering: function() {jQuery.get("/prototype/OnlineQuestionnaire/getQuestionsAndResponseChoices.xsjs", {
questionnaireResponseId: jQuery.sap.storage.get("QuestionnaireResponseId"),
password: jQuery.sap.storage.get("Password")
}).done(function(data){
that.OnlineQuestionnaire.controller.Questionnaire.prototype.checkData();
}).fail(function(jqXHR){
MessageBox.show(jqXHR.responseText, "ERROR", "Service Call Error");
});
},
checkData: function(){console.log("Hi");
}
在我的.done()中,我想访问checkData()方法,但我无法访问,因为我不知道如何调用控制器的方法。我尝试了各种方法:
sap.ui.controller("OnlineQuestionnaire.controller.Questionnaire").checkData();
然后我累了:
sap.ui.getCore().byId('Questionnaire').getController().checkData();
这回复了我undefined
。所以我仍然无法弄清楚如何获取我的控制器然后调用它的方法。但是我找到了一个解决方法,并使用以下方法使其工作,首先我定义了var that = this;
所以现在我的那个由window对象组成,然后我调用了以下':
that.OnlineQuestionnaire.controller.Questionnaire.prototype.checkData();
但应该有更简单的方法,我错过了一些东西。任何人都可以建议一个更简单的解决方案。
答案 0 :(得分:2)
您可以使用bind确保this
指向完成方法内的控制器。请read了解JavaScript中this
与其他编程语言相比的特殊行为。
jQuery.get("/prototype/OnlineQuestionnaire/getQuestionsAndResponseChoices.xsjs", {
questionnaireResponseId: jQuery.sap.storage.get("QuestionnaireResponseId"),
password: jQuery.sap.storage.get("Password")
}).done(function(data) {
this.checkData();
}.bind(this)).fail(function(jqXHR) {
MessageBox.show(jqXHR.responseText, "ERROR", "Service Call Error");
});
还有其他解决方案,例如使用帮助变量that
来保留原始上下文但我不喜欢这样,因为它会降低您的代码的可读性。
我认为checkData应该对您的数据做些什么。因此,您应该将它们传递给方法:
this.checkData(data)
答案 1 :(得分:2)
好吧,如果我理解正确,那么你的问题就是控制器失去了完成回调的上下文。
有两种方法可以解决这个问题:
var that = this;
在 onBeforeRendering 功能的开头,在完成回调中,只需调用:
that.checkData();
onBeforeRendering: function() {
jQuery
.get("/prototype/OnlineQuestionnaire/getQuestionsAndResponseChoices.xsjs", {
questionnaireResponseId: jQuery.sap.storage.get("QuestionnaireResponseId"),
password: jQuery.sap.storage.get("Password")
})
.done(function(data) {
this.checkData();
}.bind(this))
.fail(function(jqXHR) {
MessageBox.show(jqXHR.responseText, "ERROR", "Service Call Error");
});
},
checkData: function() {
console.log("Hi");
}
要更多地了解这些内容,您可以阅读有关JS上下文,范围和结束语的任何信息,即http://ryanmorr.com/understanding-scope-and-context-in-javascript/