"%" получает 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, вам нужно декодировать дважды. Остальное, как вы делаете один раз, это хорошо.