我对所有使用模块,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;
}
答案 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