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

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

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

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

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

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

Что смешно:

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

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

"Uncaught TypeError: Cannot read property 'getModel' of undefined".

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

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

Попробуйте поместить метод getModel () после открытия диалогового окна. В первый раз диалог не открывался. Итак, this.getView () возвращает undefined.

d01ph1n 12.12.2018 11:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
2 577
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Если вы хотите решить проблему отсутствия просмотра, вы можете попробовать

var backendData = oManualUploadController.onGenerateBackendData().bind(this)
Ответ принят как подходящий

Пробуя различные предложения @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
},

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

Другие вопросы по теме