SAPUI5:来自其他控制器的函数调用-如何实例化控制器或this.getView()?

时间:2018-12-12 09:42:52

标签: javascript function controller sapui5 instantiation

在我的 MainController 中,我想通过按下按钮从 ManualUploadController 中调用一个函数

函数调用本身可以正常工作:

var oManualUploadController = new ManualUpload(); 
var backendData = oManualUploadController.onGenerateBackendData();

但是,在 onGenerateBackendData()方法中,我检索了像这样的模型:

var oModel = this.getView().getModel('odataDetails');

有趣的是:

ManualUploadController 创建一个带有某些逻辑的对话框,而 MainController 是打开该对话框的“主页”。< / p>

最初访问主页并尝试推送/执行该功能时,出现错误

  

“未捕获的TypeError:无法读取未定义的属性'getModel'”。

但是如果先前已经打开对话框,然后再次关闭对话框,然后按下主页上的按钮,则函数调用可以正常工作而没有任何错误。

我是否必须以某种方式实例化控制器,或者如何解决此问题?

我真的希望,我设法解释了我的问题,以便您理解。如果让我再试一次,请告诉我! 谢谢!

3 个答案:

答案 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.jsonComponent.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();
            ...
        }
    });
});