Вызов функции из контроллера из функции события отзывчивого всплывающего окна

У меня есть отзывчивое всплывающее окно, содержащее список в режиме «Удалить». Когда я нажимаю, чтобы удалить элемент, функция вызывается при нажатии. С помощью этой функции 'это' является oList, а oEvent.oSource также является oList. Из функции события мне нужно вызвать функцию в моем контроллере. Я не могу найти способ сослаться на свой контроллер, даже не используя sap..core..byId("Detail") или даже полное пространство имен. Я попытался подняться по дереву элементов от oEvent.oSource.getParent().getParent(), чтобы затем вызвать .getController(), но это тупик.

        handlePressViewSelection: function(oEvent) {
        var oResourceBundle = this.getResourceBundle();

        //create the list
        var oList = new sap.m.List({
            mode: "Delete",
            delete: this.handleDeleteSelectionItem
        });

        oList.setModel(this._oSelectedTrainingsModel);

        var oItemTemplate = new sap.m.StandardListItem({
            title : "{Title}",
            description : "{=${Begda} ? ${Type} - { path: 'Begda', type: 'sap.ui.model.type.Date', formatOptions: { style: 'medium' }} : ${Type}}",
            icon : "{icon}",
            iconInset : false
        });

        oList.bindAggregation("items", {
            path: "/",
            template: oItemTemplate,
            type: "Active"
        });

        var oBeginButton = new sap.m.Button({
            text: "Action1",
            type: sap.m.ButtonType.Reject,
            press: function(){
                oResponsivePopover.setShowCloseButton(false);
            }
        });
        var oEndButton = new sap.m.Button({
            text: "Action2",
            type: sap.m.ButtonType.Accept,
            press: function(){
                oResponsivePopover.setShowCloseButton(true);
            }
        });

        var oResponsivePopover = new sap.m.ResponsivePopover({
            placement: sap.m.PlacementType.Bottom,
            title: "",
            showHeader: false,
            beginButton: oBeginButton,
            endButton: oEndButton,
            horizontalScrolling: false,
            content: [
                oList
            ]
        });

        oResponsivePopover.openBy(oEvent.oSource);
    },

        handleDeleteSelectionItem: function(oEvent) {
        var oListItem = oEvent.getParameter('listItem');
        var oList = oListItem.getParent();
        var path = oListItem.getBindingContext().sPath;
        oList.getModel().getData().splice(parseInt(path.substring(1)), 1);
        oList.removeItem(oEvent.getParameter('listItem'));
        oList.getParent().getParent().getController()._updateViewSelectionButtonText(); //--> BROKEN
    },

person Pieter    schedule 28.07.2016    source источник


Ответы (1)


Когда вы создаете всплывающее окно из фрагмента, вы можете указать «Контроллер, который будет использоваться для обработчиков событий во фрагменте» (см. https://sapui5.hana.ondemand.com/#docs/api/symbols/sap.ui.html#.xmlfragment)

Например:

onOpenResponsivePopover : function(oEvent) {

    if (!this._oResponsivePopover) {
        // adding 'this' makes sure you specify the current controller to be used for event handlers 
        this._oResponsivePopover = sap.ui.xmlfragment("namespace.to.your.popoverfragment", this); 
        this.getView().addDependent(this._oResponsivePopover);
    }

    this._oResponsivePopover.openBy(oEvent.getSource());
},
person Qualiture    schedule 28.07.2016
comment
А когда вы не используете фрагмент, а создаете поповер чисто на JS? - person Pieter; 28.07.2016
comment
Можете ли вы обновить свой вопрос с кодом, как вы создаете свой элемент управления всплывающим окном? - person Qualiture; 28.07.2016
comment
Питер, я полагаю, вы создаете всплывающее окно внутри контроллера? Если да, я думаю, вы можете использовать bind(this). Вероятно, вы должны процитировать свой код в исходном сообщении. - person slkorolev; 28.07.2016
comment
Если я правильно понимаю, вы создаете всплывающий интерфейс внутри контроллера? Мне кажется, что this.handleDeleteSelectionItem должен работать нормально (при условии, что метод handleDeleteSelectionItem существует в том же контроллере). Однако для упрощения кодирования и обслуживания я бы посоветовал поместить всплывающий пользовательский интерфейс в отдельный JSFragment. - person Qualiture; 28.07.2016
comment
Извините, если это было неясно, this.handleDeleteSelectionItem действительно работает. Однако именно в этой функции я не могу вызвать другую функцию с моего контроллера... - person Pieter; 28.07.2016
comment
ОК Готово, см. исходный пост. - person Pieter; 28.07.2016
comment
Можете ли вы попробовать с delete: [this.handleDeleteSelectionItem, this] в вашем определении удаления списка? - person Qualiture; 28.07.2016
comment
Это работает! Я никогда не знал, что ты можешь сделать это. Откуда я должен был знать? Возможно ли также передать такие параметры, как [this.handleDeleteSelectionItem, this, param1, param2]? - person Pieter; 28.07.2016
comment
Это не так ясно из API, но если вы посмотрите на часть сведений о конструкторе в ListBase (sapui5.hana.ondemand.com/#docs/api/symbols/), в разделе "события" указано: delete : fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject]. Итак, чтобы ответить на ваш второй вопрос, вы можете передать объект в качестве первого аргумента. - person Qualiture; 28.07.2016