如何从另一个函数访问控制器的方法?

时间:2017-06-16 08:16:48

标签: sapui5

所以我在我的控制器名为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();

但应该有更简单的方法,我错过了一些东西。任何人都可以建议一个更简单的解决方案。

2 个答案:

答案 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)

好吧,如果我理解正确,那么你的问题就是控制器失去了完成回调的上下文。

有两种方法可以解决这个问题:

  1. var that = this;

    onBeforeRendering 功能的开头,在完成回调中,只需调用:

    that.checkData();

    1. 您可以通过原生js函数 bind 设置正确的上下文。它将如下所示:
    2. 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/