SAPUI5: вызов функции из другого контроллера - как создать экземпляр контроллера или this.getView ()? - PullRequest
0 голосов
/ 12 декабря 2018

В моем MainController я бы хотел вызвать функцию из моего ManualUploadController, нажав кнопку

Сам вызов функции работает нормально, как это:

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

Однако в методе onGenerateBackendData() я получаю модели, например, такие:

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

Что забавно:

ManualUploadController создает Dialog с некоторой логикойв нем MainController является «главной страницей», откуда открывается диалоговое окно.

При первоначальном доступе к главной странице и попытке нажать / выполнить эту функцию я получаю сообщение об ошибке

"Uncaught TypeError: Невозможно прочитать свойство 'getModel' of undefined".

Но когда диалоговое окно уже было открыто ранее, затем снова закрыто и затем нажимается кнопка на главной странице, функцияcall работает нормально, без ошибок.

Нужно ли как-то создавать экземпляр контроллера или как я могу решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Пробуя различные предложения @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
},
0 голосов
/ 12 декабря 2018

Если у вас есть код, который вы хотите использовать в нескольких контроллерах, я бы предложил поместить эту логику в новый файл / класс.Передайте компонент приложения в конструктор, поскольку он имеет доступ ко всем моделям, определенным в 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();
            ...
        }
    });
});
0 голосов
/ 12 декабря 2018

Если у вас есть MainController и ManualUploadController, я бы предложил поместить функцию в MainController, если вы хотите вызывать ее в обоих контроллерах.

Если вы используете библиотеки, попробуйте сначала создать экземпляр.

Но ваша проблема немного сложна.

Если вы хотите получить модель, вы можете попробовать получить ее через компонент.

Если вы хотите решить проблему с ошибкойчтобы получить представление, вы можете попробовать

var backendData = oManualUploadController.onGenerateBackendData().bind(this)
...