навигация по приложениям Fiori Cross; Обработка параметров запуска?

Этот вопрос связан с:

Мой вариант использования таков:

У меня есть несколько приложений, которые должны ссылаться на другие (глубокие). Поскольку в документации упоминается перекрестная навигация, чтобы избежать глубоких ссылок, я решил использовать параметр запуска.

Например:

Приложение A имеет список некоторых элементов, в подробном представлении одного элемента есть ссылка на другое приложение B, которое содержит некоторые другие сведения. Предположим, что A показывает сведения о статье, а B показывает некоторые сведения о производителе статьи.

Теперь приложение A будет использовать такую ​​навигацию:

sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
  target : { semanticObject : "ApplicationB", action : "display" },
  params : { "someID" : "102343333"}
})

Теперь в приложении B я использую такой код внутри Component.js в конце метода init.

var oRouter = that.getRouter().initialize();
var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    oRouter.navTo("SomeView", {
        someId : oComponentData.startupParameters.someID[0],
    }, false);
}

Первый вопрос: это правильное место для обработки параметров запуска?

Второй вопрос: Если я использую навигацию, параметр запуска все равно будет в коде, я бы предпочел его убрать, но как?

Обновлять

В целевом приложении (B) это приведет к следующему URL-адресу:

https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?someID=102343333&/SomeView(102343333)/

Во всяком случае, я бы предпочел иметь что-то вроде этого:

https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?/SomeView(102343333)/

person user3783327    schedule 01.02.2016    source источник


Ответы (3)


Параметр должен быть получен как

var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    oRouter.navTo("SomeView", {
        someId : oComponentData.startupParameters.someID[0],
    }, false);

как вы пишете. В приложениях Fiori параметры запуска, введенные в данные компонента вашего конструктора, могут быть переименованы, дополнены дополнительными значениями по умолчанию и т. д. Таким образом, они могут отличаться от параметра, наблюдаемого в URL-адресе. Приложениям рекомендуется воздерживаться от попыток напрямую проверить URL-адрес.

Если указать очень длинный набор параметров URL-адреса, можно заметить, что FLP заменяет некоторые из них на sap-intent-param=AS123424 ("сжатый URL-адрес"), чтобы обойти ограничения длины URL-адреса на некоторых платформах и в закладках, в getComponentData().startupParameters получит полный набор параметров).

Что касается второго вопроса. Нет, в настоящее время нет способа «очистить» URL-адрес и избежать избыточности между и внутренним маршрутом приложения.

SemObject-display?someID=102343333&/SomeView(102343333)/ который после навигации может выглядеть как SemObject-display?someID=102343333&/SomeView(102343999)/

Приложение было запущено с номером 102343333, но затем пользователь перешел в приложении к другому элементу (102343999).

Любое изменение в «оболочке» файла has (SemObject-display?someID102343333) приведет к переходу между приложениями (повторному созданию вашего компонента) с другим параметром запуска.

(Есть случаи, когда это желательно в потоке, например, перекрестный переход от информационного бюллетеня организационного подразделения к информационному бюллетеню родительского организационного подразделения по ссылке).

В SAP были идеи объединить внутренние маршруты приложений и параметры намерения, но они не были реализованы, так как это в основном эстетика URL.

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

SemObject-display?someID=102343333&/SomeView(102343999)/ (Пока смотрел на 9999(!)).

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

Поэтому измените код на:

var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    if (sap.ui.core.getHashChanger().getHash()=== "") {
         // if no inner app route present, navigate 
         oRouter.navTo("SomeView", {
               someId : oComponentData.startupParameters.someID[0],
         }, false);
    }

}

https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ushell.services.CrossApplicationNavigation.html

Панель запуска SAP Fiori для разработчиков, концепция навигации http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/907ae317-cb47-3210-9bba-e1b5e70e5c79?QuickLink=index&overridelayout=true&59575491523067

person user6649841    schedule 28.07.2016
comment
sap.ui.core.getHashChanger().getHash(), похоже, не существует. Возможно, вы имеете в виду var oHashChanger = new sap.ui.core.routing.HashChanger(); var sHash = oHashChanger.getHash(); ? В любом случае хэш также будет включать имя семантического объекта, и поэтому он ни в коем случае не будет пустым. Есть ли хороший способ проверить, пуста ли маршрутная часть приложения? - person user3783327; 06.08.2018
comment
Я столкнулся с тем же самым в UI5 1.44, но sap.ui.core.routing.HashChanger.getInstance() предоставит вам экземпляр хэш-чейнджера, он не содержит семантического имени объекта и действия, только хэш URL после этого, поэтому на вашем начальном маршруте он возвращает пустую строку, как предложенный выше код - person ChrisM; 15.08.2018

У меня были проблемы с переходом из приложения Fiori elements на глубокую страницу в приложении Freestyle UI5, а затем ответ от @user6649841 предоставил наиболее решение для моего требования.

В моем случае при переходе от отчета со списком элементов (приложение «A») к целевому приложению для фристайла (приложение «B») я не хотел, чтобы рабочий список/начальная страница в приложении B вообще отображался, и вместо этого сразу переходил к страницу сведений без мерцания начального экрана приложения.

Приведенное ниже сработало для меня, обратите внимание, хотя это не решает уродливые проблемы с URL. В моем случае я не беспокоюсь об этом, так как моя навигация назад будет возвращаться к отчету о списке элементов (приложение A) и никогда не показывать страницу рабочего списка в приложении B, поэтому пользователь никогда не будет выполнять другой поиск поверх этого URL-адреса, который вести с несовместимыми внутренними и внешними ключами

Component.js (в конце функции инициализации после всего стандартного кода sap, но до инициализации роутера):

var oComponentData = this.getComponentData();
var startupParams = oComponentData.startupParameters;

 if (startupParams && startupParams.myQueryStringParamName && startupParams.myQueryStringParamName[0]) {
    //In my case using hash changer as I dont want the original landing page (default route) to be
    //in the history, so the detail page loads straight away and nav back will cause to nav back to App A
    var hashChanger = sap.ui.core.routing.HashChanger.getInstance();
    hashChanger.replaceHash("detailPage/" + startupParams.myQueryStringParamName[0]);
}
//initialise after the above so the new hash is set and it doesnt initially load the
//page assigned to the default route causing a flickering and nav slide effect
this.getRouter().initialize();

Глядя на SDK UI5 в UI5 1.48 и выше в методе инициализации маршрутизатора, вы можете передать логическое значение, чтобы указать ему игнорировать начальный хеш, поэтому, возможно, можно будет сделать более простую реализацию в более новых выпусках UI5

person ChrisM    schedule 15.08.2018

Подходит ли Component.js для обработки параметров запуска?

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

Ваш второй вопрос мне не совсем ясен.

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

person Sunil B N    schedule 01.02.2016
comment
Предположим, два автономных приложения имеют возможность поиска. Например, приложение статьи и приложение производителя. Теперь у статьи есть производитель, и должна быть возможность перейти к представлению сведений о производителе в приложении производителя из приложения статьи, то есть без просмотра экрана поиска производителя. - person user3783327; 01.02.2016
comment
это выполнимо.. у вас есть параметр контекста, который вы можете передать - person Sunil B N; 01.02.2016
comment
Если вы посмотрите на мой код, это то, что я делаю. Но параметры запуска выглядят так: BASE?param1=value¶m2=value мой обычный # Навигация будет делать что-то вроде этого /DetailPage(ID) если я объединю это, у меня будет BASE?param1=value¶m2=value&/DetailPage(ID) это не так красивый. - person user3783327; 01.02.2016