Скрыть кнопки «Утвердить/Отклонить» на странице сведений о мастере Fiori

Я хочу скрыть кнопки «Утвердить/Отклонить» на странице «Подробности» приложения Fiori на основе определенных условий фильтра. Фильтры добавляются в представление основного списка (представление слева) через расширение представления/контроллера. Теперь, если пользователь выбирает определенный тип фильтра (скажем, «Прошлые заказы»), кнопка «одобрить/отклонить» не должна отображаться на странице сведений о заказе. Вот как я определил кнопки в представлении «Заголовок/Подробности».

 this.oHeaderFooterOptions = {
                       oPositiveAction: {                       
                        sI18nBtnTxt: that.resourceBundle.getText("XBUT_APPROVE"),
                        id :"btn_approve",
                        onBtnPressed: jQuery.proxy(that.handleApprove, that)
                       },

                   oNegativeAction: {                   
                    sI18nBtnTxt: that.resourceBundle.getText("XBUT_REJECT"),
                    id :"btn_reject",
                    onBtnPressed: jQuery.proxy(that.handleReject, that)
                   },

Однако во время выполнения этим кнопкам не назначаются упомянутые мной идентификаторы, вместо этого они создаются с идентификаторами __button0 и __button1.

Есть ли способ скрыть эти кнопки из основного списка?

Спасибо.


person user3161840    schedule 01.10.2014    source источник


Ответы (3)


Рекомендуется: принципы проектирования SAP Fiori говорят только об отключении кнопок нижнего колонтитула вместо изменения видимости Button. Подробнее о рекомендациях

В зависимости от условий фильтра можно отключить так:

this.setBtnEnabled("btn_approve", false);

включить снова: this.setBtnEnabled("btn_approve", true);

Точно так же вы можете изменить текст кнопки, используя this.setBtnText("btn_approve", "buttonText");

Другой способ: Как сказал @TobiasOetzel, используйте

this.setHeaderFooterOptions(yourModifiedHeaderFooterOptions);
person Sunil B N    schedule 10.05.2015

вы можете вызывать setHeaderFooterOptions на вашем контроллере несколько раз, например:

//Code inside of the controller
_myHeaderFooterOptions = {
    oPositiveAction: {                       
        sI18nBtnTxt: that.resourceBundle.getText("XBUT_APPROVE"),
        id :"btn_approve",
            onBtnPressed: jQuery.proxy(that.handleApprove, that)
        },
    oNegativeAction: {                   
        sI18nBtnTxt: that.resourceBundle.getText("XBUT_REJECT"),
        id :"btn_reject",
        onBtnPressed: jQuery.proxy(that.handleReject, that)
    }
},

//set the initial options
onInit: function () {
    this.setHeaderFooterOptions(this._myHeaderFooterOptions);
},

//modify the options in an event
onFilter : function () {
    //remove the negative action to hide it
    this._myHeaderFooterOptions.oNegativeAction = undefined;
    this.setHeaderFooterOptions(this._myHeaderFooterOptions);
},

//further code

поэтому, манипулируя _myHeaderFooterOptions, вы можете влиять на отображаемые кнопки.

person TobiasOetzel    schedule 06.10.2014
comment
Привет Тобиас - Спасибо за ваш ответ. Проблема в том, что обработчик события фильтра определен в другом контроллере (список S2), а кнопки находятся в представлении заголовка S3. Как в таком случае управлять видимостью кнопок? - person user3161840; 06.10.2014
comment
Привет, вы можете запускать событие через шину событий вашего компонента, см. openui5.hana.ondemand.com/#docs/api/symbols/. Вы публикуете событие в контроллере S3 и подписываетесь на контроллер S2. Обработчик подписки вы изменяете headerFooterOptions - person TobiasOetzel; 07.10.2014
comment
Привет Тобиас - это хорошая идея. Спасибо за ваш ответ. извините, что поздно вернулся. Вместо того, чтобы получать глобальную шину событий, есть ли способ получить шину событий компонента? Это было бы уместно, я думаю. - person user3161840; 14.10.2014
comment
Привет, в ссылке, которую я разместил, есть функция, описанная myComponent.getEventBus(). Эта шина событий будет отправлять события, видимые только этому экземпляру шины событий. - person TobiasOetzel; 15.10.2014

Во-первых, вы должны использовать sId вместо id при определении HeaderFooterOptions, вы можете получить кнопки нижнего колонтитула с помощью sId, например, кнопку Approve.

this._oControlStore.oButtonListHelper.mButtons["btn_approve"]

Пожалуйста, проверьте следующий фрагмент кода:

S2.view.controller: у вас есть обработчик событий фильтра, определенный следующим образом, и вы используете EventBus для публикации событий с OrderTypeChanged по S3.view.controller.

onFilterChanged: function(oEvent) {
    // Set the filter value, here i use hard code
    var sFilter = "Past Orders";
    sap.ui.getCore().getEventBus().publish("app", "OrderTypeChanged", {
         filter: sFilter
    });
}

S3.view.controller: подпишитесь на событие OrderTypeChanged от S2.view.controller.

onInit: function() {
    ///
    var bus = sap.ui.getCore().getEventBus();
    bus.subscribe("app", "OrderTypeChanged", this.handleOrderTypeChanged, this);

},

getHeaderFooterOptions: function() {

    var oOptions = {

        oPositiveAction: {
            sI18nBtnTxt: that.resourceBundle.getText("XBUT_APPROVE"),
            sId: "btn_approve",
            onBtnPressed: jQuery.proxy(that.handleApprove, that)
        },

        oNegativeAction: {
            sI18nBtnTxt: that.resourceBundle.getText("XBUT_REJECT"),
            sId: "btn_reject",
            onBtnPressed: jQuery.proxy(that.handleReject, that)
        }
    };
    return oOptions;

},
handleOrderTypeChanged: function(channelId, eventId, data) {
    if (data && data.filter) {
        var sFilter = data.filter;
        if (sFilter == "Past Orders") {
            this._oControlStore.oButtonListHelper.mButtons["btn_approve"].setVisible(false);
        }
        //set Approve/Reject button visible/invisible based on other values 
        //else if(sFilter == "Other Filter") 
    }
}
person Haojie    schedule 08.10.2014
comment
Привет Аллен, спасибо за ваш ответ. извините, что поздно вернулся. Вместо того, чтобы получать глобальную шину событий, есть ли способ получить шину событий компонента? - person user3161840; 14.10.2014
comment
Итак, я получил шину событий компонента..var c = sap.ui.core.Component.getOwnerIdFor(this.getView()); var localEventBus = sap.ui.component(c).getEventBus(); localEventBus.publish(zPrApp,showHideApprovalButtons,{id:sButtonId}); А затем в другом представлении controllerlocalEventBus.subscribe(zPrApp,showHideApprovalButtons, this.handleApprovalButtonsVisibility, this); Это отлично работает на настольных компьютерах, но не работает на iPhone. Странно. Ошибка на телефонах: кнопка отклонения не определена. this._oControlStore.oButtonListHelper.mButtons возвращает только кнопку одобрения. - person user3161840; 15.10.2014
comment
Привет, я пробовал под эмулятором Chrome iPhone, и он работает для кнопки отклонения. Странный. - person Haojie; 15.10.2014
comment
Аллен, я пробовал в реальном симуляторе iPhone и Chrome, кнопка отказа не работает. Видите ли вы кнопку «Отклонить» как лист действий или она отображается рядом с «Утвердить». В моем случае кнопка «Отклонить» появляется как ActionSheet. - person user3161840; 15.10.2014
comment
Привет, не могли бы вы попробовать получить это ._oControlStore.oButtonListHelper.oOverflowList.mButtons, чтобы увидеть, есть ли там кнопка «Отклонить»? Если да, то есть индикатор этого._oControlStore.oButtonListHelper.bHasOverflow. - person Haojie; 16.10.2014
comment
Привет, Аллен, столкнулся со странной проблемой. Событие скрытия/отображения не работает с первого раза на айфонах. когда приложение загружается, если вы нажимаете прямо на любой фильтр в представлении S2, оно переходит в представление S3, но кнопки не скрываются ... это происходит только в первый раз, и это тоже происходит, если вы нажимаете фильтр напрямую. - person user3161840; 12.12.2014
comment
-1 для использования частных переменных. не рекомендуется использовать переменные с _someVariable.. внутренняя реализация может измениться с новыми версиями SAPUI5. Поэтому не используйте - person Sunil B N; 10.05.2015