"%" получает URI, в то время как все остальное не

У меня странная проблема с UI5. Я создаю строку из контекста привязки элемента управления, который выглядит следующим образом:

Entity('Element%3AInfo%2CID')

Просто для информации, это выглядит так: Entity('Element:Info,ID')

Тем не менее, я получаю эту строку из следующей цепочки методов:

oItem.getBindingContext().getPath().substr(1)

Итак, весь (довольно простой) блок "перейти к" выглядит следующим образом:

showElement : function (oItem) {
    'use strict';

    var bReplace = jQuery.device.is.phone ? false : true;

    sap.ui.core.UIComponent.getRouterFor(this).navTo("element", {
        from: "master",
        element: oItem.getBindingContext().getPath().substr(1),
        otherpattern: "something"
    }, bReplace);
},

Консольный журнал в этом блоке console.log(oItem.getBindingContext().getPath().substr(1)); предоставляет правильную строку.

Консольный вывод console.log(oItem.getBindingContext(). GetPath(). Substr(1)): Entity('Элемент%3AInfo%2CID')

Проблема (знайте, это становится любопытным), что мой шаблон URL "{element}"заполнен:

Entity('Element%253AInfo%252CID')

Раскодированный: Entity('Element%3AInfo%2CID')

Как вы, наверное, уже знаете, шаблон "%" закодирован. Я не понимаю, почему UI5 сделал бы это.

Вы также должны знать эти факты, которые я проверял:

  • decodeURIComponent(oItem.getBindingContext().getPath().substr(1)) приводит кEntity('Element:Info,ID')"
  • encodeURIComponent(oItem.getBindingContext().getPath().substr(1)) приводит кEntity('Element%25253AInfo%25252CID')"
  • oItem.getBindingContext().getPath().substr(1).replace("%3A", ":") приводит кEntity('Element:Info%252CID')"

Это ошибка? Я имею в виду, что шаблон URI остается нетронутым до тех пор, пока он не достигнет "%". По какой-то странной причине этот специальный символ закодирован, а все остальное не имеет значения.

1 ответ

Решение

Это не совсем то, что "%" кодируется, а все остальное не кодируется.

Я тоже сталкивался с этой проблемой. SAPUI5 выполняет кодирование один раз, а браузер - второй. Следовательно, во второй итерации у вас будет только "%" для кодирования.

Начальная строка: Element:Info,ID

после первой итерации кодирования (с помощью инфраструктуры UI5) encodeURIComponent('Element:Info,ID'): Мы получаем Element%3AInfo%2CID

Так что для второй итерации, только% остается для кодирования Element%253AInfo%252CID следовательно мы получаем это.

Так что, если вы выбираете контекст привязки из URL, вам нужно декодировать дважды. Остальное, как вы делаете один раз, это хорошо.

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