在我的 MainController 中,我想通过按下按钮从 ManualUploadController 中调用一个函数
函数调用本身可以正常工作:
var oManualUploadController = new ManualUpload();
var backendData = oManualUploadController.onGenerateBackendData();
但是,在 onGenerateBackendData()方法中,我检索了像这样的模型:
var oModel = this.getView().getModel('odataDetails');
有趣的是:
ManualUploadController 创建一个带有某些逻辑的对话框,而 MainController 是打开该对话框的“主页”。< / p>
最初访问主页并尝试推送/执行该功能时,出现错误
“未捕获的TypeError:无法读取未定义的属性'getModel'”。
但是如果先前已经打开对话框,然后再次关闭对话框,然后按下主页上的按钮,则函数调用可以正常工作而没有任何错误。
我是否必须以某种方式实例化控制器,或者如何解决此问题?
我真的希望,我设法解释了我的问题,以便您理解。如果让我再试一次,请告诉我! 谢谢!
答案 0 :(得分:0)
如果您拥有MainController和ManualUploadController,建议您在两个控制器中同时调用该函数时,建议将该函数放入MainController中。
如果您使用的是库,请尝试首先实例化。
但是您的问题有点复杂。
如果要获取模型,可以尝试通过Component来获取。
如果要解决无法查看的问题,可以尝试
var backendData = oManualUploadController.onGenerateBackendData().bind(this)
答案 1 :(得分:0)
尝试@Blangero的不同建议,我最终想出了一个可行的解决方案。 (不幸的是,“。bind(this)”方法不起作用。这将是最简洁的解决方案)
这就是我所做的:
我在控制器的任何功能之外定义了 manualDialogView :
sap.ui.define([
'workspace/controller/ManualUpload.controller',
],
function(ManualUpload) {
var oManualUploadController = new ManualUpload();
var manualDialogView = sap.ui.view({
viewName: "workspace.view.ManualDialog",
controller: oManualUploadController,
type: sap.ui.core.mvc.ViewType.XML
});
return BaseController.extend('workspace.controller.MainHeader', {
...
// rest of controller
...
}
然后我在 onInit()中实例化主视图,并添加 manualDialogView 作为依赖项:
onInit : function() {
var view = this.getView();
view.addDependent(manualDialogView);
},
最后,打开我的 manualDialogView 是在一个单独的函数中,而我想从另一个控制器获取的函数调用在另一个函数中运行正常:
onOpenManualDialog: function(oEvent) {
var dialog = manualDialogView.byId("manualUploadDialog");
manualDialogView.callbackAPI = this.callbackAPI;
dialog.open();
},
onExportBackendTable: function() {
var backendData = oManualUploadController.onGenerateBackendData();
... not relevant code
},
答案 2 :(得分:0)
如果您有要在多个控制器中使用的代码,我建议您将该逻辑放入新的文件/类中。将应用程序组件传递给构造函数,因为它可以访问manifest.json
和Component.js
中定义的所有模型。
webapp / util / UploadHelper.js:
sap.ui.define([
"sap/ui/base/Object"
], function (BaseObject) {
"use strict";
return BaseObject.extend("workspace.util.UploadHelper", {
/**
* @param {sap.ui.core.UIComponent} oComponent reference to the app's component
*/
constructor: function (oComponent) {
this._oComponent = oComponent;
this._oResourceBundle = oComponent.getModel("i18n").getResourceBundle();
this._oModel = oComponent.getModel("odataDetails");
},
generateBackendData: function () {
// you can access this._oModel here and do stuff
return stuff;
}
});
});
然后可以在控制器中执行
webapp / controller / MainHeader.controller.js
sap.ui.define([
"workspace/controller/BaseController",
"workspace/util/UploadHelper"
],
function(BaseController, UploadHelper) {
"use strict";
return BaseController.extend('workspace.controller.MainHeader', {
onInit: function() {
// pass your component.js to the constructor
var oComponent = this.getOwnerComponent();
this._oUploadHelper = new UploadHelper(oComponent);
...
},
onExportBackendTable: function() {
var oBackendData = this._oUploadHelper.generateBackendData();
...
}
});
});