Как добавить событие щелчка в плитку в плагине FLP?

#sapui5 #sap-fiori

#sapui5 #sap-fiori

Вопрос:

Я хочу добавить событие щелчка ко всем плиткам на панели запуска без изменения какого-либо кода внутри плитки. Для этого я создаю плагин FLP. Чтобы прикрепить событие нажатия к плитке, я попытался получить плитки, используя следующий код:

 

sap.ushell.Container.getService("LaunchPage").getGroups().then(function(aGroups) {
                for (var i = 0; i < aGroups.length; i  ) {
                    var aTiles = sap.ushell.Container.getService("LaunchPage").getGroupTiles(aGroups[i]);
                    for (var j = 0; j < aTiles.length; j  ) {
                    aTiles[j].getImplementationAsSapui5().getTileControl().attachPress(function(oEvent) {
                                console.log("Tile clicked")
                            });
                        }
                }
            });
 

Ошибки нет, но она не показывает «Щелчок по плитке» при нажатии на любую плитку. Если я получаю плитки, используя следующий код, он работает нормально:

     var aTiles = sap.ushell.utils.getVisibleTiles();
            for (var j = 0; j < aTiles.length; j  ) {
                aTiles[j].attachPress(function(oEvent) {
                    console.log(oEvent.getSource().getBindingContext().getObject().object.getTitle());
                });
            }
 

Проблема в том, что он возвращает только видимые плитки на экране.

Может кто-нибудь, пожалуйста, помочь мне здесь?

Ответ №1:

Я буду использовать ваш код, и если я смогу дать вам некоторую информацию, я отвечу снова.

Я даю вам две идеи для возможных обходных путей для ваших сомнений:

  • В моем случае, для выполнения некоторых пользовательских действий с домашними плитками, я создал пользовательский тип плитки, возможно, вы могли бы рассмотреть его.
  • Другим решением, которое я создал для отправки событий навигации Google Analytics, было создание плагина SAPUI5 для обработки изменений хэша. Тогда я знаю, где я и куда я хочу пойти.

С уважением

Комментарии:

1. Если я использую изменение хэша, оно будет срабатывать даже при навигации внутри приложения. И в этом случае, как я получу заголовок плитки из хэш-значения?

2. В моем случае я использую переменную в плагине sapui5 для проверки некоторого поведения. Кроме того, для меня хэш был лучше, чем заголовок, потому что SAP FLP является многоязычным, и для некоторой статистики хэш одинаков на испанском, английском и т. Д

3. ах, я вижу преимущество использования хэша. Есть ли способ узнать группу, из которой нажимается плитка, для случаев, когда плитка присутствует в нескольких группах.

4. да, я надеюсь, что другая точка зрения поможет вам найти решение.

Ответ №2:

Я решил это, прикрепив событие изменения хэша. Я получаю все имена плиток и значения хэша с помощью службы launchPage, а затем использую это при изменении хэша, чтобы соответствовать значению хэша для получения заголовка. Даже если плитка открывается напрямую с использованием URL-адреса, событие будет захвачено.

 
sap.ushell.Container.getService("LaunchPage").getGroups().then(function(aGroups) {
for (var i = 0; i < aGroups.length; i  ) {
    var aGrpTiles = 
          sap.ushell.Container.getService("LaunchPage").getGroupTiles(aGroups[i]);
    for (var j = 0; j < aGrpTiles.length; j  ) {
        var sTileTitle = sap.ushell.Container.getService("LaunchPage").getTileTitle(aGrpTiles[j]);
        var sTileTarget = sap.ushell.Container.getService("LaunchPage").getCatalogTileTargetURL(aGrpTiles[j]);
        if (sTileTitle.indexOf("App Launcher") === 0) {
         sTileTitle = sTileTarget;
        }       
        window.UserTiles.push({
            title: sTileTitle,
            url: sTileTarget
        });
    }
  }
}.bind(this));

window.addEventListener("hashchange", this._onHashChange.bind(this), true);

_onHashChange: function(oEvent) {
    var sOldHash = this._getHashFromURL(oEvent.oldURL);
    var sNewHash = this._getHashFromURL(oEvent.newURL);
    //handled for the change of URL while navigation within the app
    if (sOldHash !== sNewHash) {
        console.log("new tile");
        var tile = window.UserTiles.filter(function(o) {
          if (o.url) {
            return sap.ushell.utils.getBasicHash(o.url).indexOf(sHash) === 0;
          }
       });
       console.log("tile title:"   tile[0].title, "tile hash:"  tile.url);
    }
}