在另一个控制器中调用一个控制器的方法?

时间:2017-06-12 14:46:41

标签: sapui5

我对所有使用模块,eventbus的流行语感到困惑。

我会尝试用更简单的词语重新解释我的问题,因为我是这个框架的新手,我想以简单的方式理解它。所以这就是我想要实现的目标:

我有一个问卷控制器,绑定到问卷调查视图。现在我需要用我的xsjs从我的后端获取一些数据并绑定到这个视图。我需要在页面呈现之前获取此数据,因此我在Before Rendering中使用我的ajax调用,并且在我的ajax调用的完整属性中,我需要执行一些vaildations。由于我在完整属性中的函数太长,我想创建一个单独的控制器,然后定义我的方法,在这里进行ajax调用和必要的验证。这个新控制器只保存此方法定义,因此它不绑定到任何视图。

现在我应该如何在调查表控制器中调用此控制器并使用其调用ajax调用的方法并在控制器方法中执行验证?

sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel",
"sap/m/MessageBox"], function(Controller, JSONModel, MessageBox) {


var questionnaireResponseId;
var password;
var backendJSON;

Controller.extend("OnlineQuestionnaire.controller.Questionnaire", {

    onInit: function() {
        jQuery.sap.require("jquery.sap.storage");

    },
    onBeforeRendering: function() {
        questionnaireResponseId = jQuery.sap.storage.get("QuestionnaireResponseId");
        password = jQuery.sap.storage.get("Password");
       backendJSON = loadStack(questionnaireResponseId);  //This is not correct way to call 
}

此方法在QuestionStack.controller.js

中定义
loadStack(questionnaireResponseId) {
jQuery.ajax({
                url: "",
                method: "GET",
                dataType: "json",
                complete: this.onSuccess,
                error: this.onErrorCall
            });


return output;
}

2 个答案:

答案 0 :(得分:2)

使用Questionnare.controller.js扩展您的QuestionStack.controller.js:

sap.ui.define([
".." // path to your QuestionStack.controller.js, e.g. "myapp/controller/QuestionStack"
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel",
"sap/m/MessageBox"], function(Controller, JSONModel, MessageBox) {


var questionnaireResponseId;
var password;
var backendJSON;

QuestionStack.extend("OnlineQuestionnaire.controller.Questionnaire", { // extend
    ..
}

使用this.loadStack(..);

调用该方法

答案 1 :(得分:-2)

//修改

这里显示的解决方案将导致大量额外工作,因为您需要确保,该功能随时都会注册到事件总线(即使控制器尚未加载)。如果您100%确定,您的控制器将被加载,在您需要在其他控制器中重新调用您的功能之前,请随意使用它。否则,坚持接受的答案。

请仅加载必要的数据!

如果您只需要一个方法(或者至少不需要完整的控制器),则只应加载所需的方法。要实现这一点,您必须首先将方法注册到核心,然后才能调用它。

注册方法

// your controller, which you want to load from
sap.ui.define([
    // load your services here
], function(/* service names */) {
    "use strict";

    // register your function here
    onInit: function() {
        sap.ui.getCore().getEventBus().subscribe("myNamespace", "myFunctionName", this.myFunction, this);
    },

    myFunction: function() {
        // do stuff here
    }
});

调用方法

// working controller
// now you can just use the following line, to call the method
sap.ui.getCore().getEventBus().publish("myNamespace", "myFunctionName");

有关详细信息,请参阅此处:https://openui5.hana.ondemand.com/#docs/api/symbols/sap.ui.core.EventBus.html