В SelectOneMenu PrimeFaces я использую параметры (часто заполнители), такие как <please select>
, загружаемые из контроллера через f: selectItems и автоматически экранируемые компонентом SelectOneMenu. После обновления PrimeFaces 11 до версии 12 компонент начал дважды экранировать символы <
, >
, &
в своей метке, в то время как список параметров по-прежнему отображается должным образом. (Когда я нажимаю <please select>
, метка показывает <please select>
.)
Я пробовал все комбинации этих настроек:
"true"
/"false"
"true"
/"false"
Атрибут itemLabelEscaped не действует. Другие комбинации работают следующим образом:
< <i>italics</i>
< курсив
курсив
курсив
2
ЛОЖЬ
< <i>italics</i>
< <i>курсив</i>
< курсив
< <i>курсив</i>
3
истинный
< <i>italics</i>
< <i>курсив</i>
< <i>курсив</i>
< <i>курсив</i>
4
истинный
< <i>italics</i>
< <i>курсив</i>
< <i>курсив</i>
(ещё больше убежало)
В PrimeFaces 11 я использовал настройку №3, а метка была такой же, как и опция в выпадающем списке. После обновления метка ломается и кажется, что единственная рабочая настройка №2, но я не хочу обновлять все вхождения selectItems без необходимости.
Поскольку я не нашел никакой соответствующей информации в примечаниях к выпуску PrimeFaces, я бы посчитал это ошибкой, но мне интересно, что никто еще не сообщил об этом, поэтому я не уверен: это ошибка или функция? Этот старый вопрос кажется актуальным, но как он сработал в PrimeFaces 11?
Это известная и исправленная проблема . До выхода PrimeFaces 13 вы можете MonkeyPatch обходной путь.
@JosefPlch он работал неправильно в PF11, его также нужно экранировать и обрабатывать HTML. если вы читаете здесь, у нас даже есть интеграционные тесты для этого, потому что он должен уметь отображать HTML: github.com/primefaces/primefaces/issues/…
@JasperdeVries Хорошо, я сообщил о проблеме и предложил решение на GitHub. После исправления настройки №2 и №3, перечисленные выше, ведут себя одинаково.
Хорошо, это должно быть исправлено навсегда в PF 13.0, и этот MonkeyPatch должен решить все ваши текущие проблемы.
if (PrimeFaces.widget.SelectOneMenu) {
PrimeFaces.widget.SelectOneMenu.prototype.renderSelectItem = function(item, isGrouped) {
var content = "";
var $item = $(item);
var label;
var title = $item.data("title");
var escape = $item.data("escape");
var cssClass;
if (item.tagName === "OPTGROUP") {
label = $item.attr("label");
if (escape) {
label = $("<div>").text(label).html();
}
cssClass = "ui-selectonemenu-item-group ui-corner-all";
} else { //OPTION
if (escape) {
label = $item.html();
if ($item.text() === " ") {
label = $item.text();
}
} else {
label = $item.text();
}
cssClass = "ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all";
if (isGrouped) {
cssClass += " ui-selectonemenu-item-group-children";
}
}
var dataLabel = escape ? label.replaceAll('"', '"') : this.escapeHTMLIfNecessary(label);
if ($item.data("noselection-option")) {
cssClass += " ui-noselection-option";
}
content += '<li class = "' + cssClass + '" tabindex = "-1" role = "option"';
if (title) {
content += ' title = "' + title + '"';
}
if ($item.is(':disabled')) {
content += ' disabled';
}
content += ' data-label = "' + dataLabel + '"';
content += '>';
content += label;
content += '</li>';
if (item.tagName === "OPTGROUP") {
content += this.renderSelectItems($item, true);
}
return content;
};
PrimeFaces.widget.SelectOneMenu.prototype.escapeHTMLIfNecessary = function(value) {
return String(value).replace(/[<>"'`=/]/g, function(s) {
return PrimeFaces.entityMap[s];
});
};
}
Это заставляет метку в PrimeFaces 12 работать так же, как и в версии 11. Вопрос: не лучше ли оставить метку без изменений и сохранить < <i>italics</i>
и для № 2, и для № 3? Это поведение моего исправления. Решение, которое лучше, остается за каждым разработчиком.
Я ответил в билете PF. Похоже, у вас отсутствует один из ваших вариантов использования.
Отлично, уже несколько дней ищу отчет. Однако MonkeyPatch проблематичен. Это действительно исправляет обработку
<>&
, о которой я просил, но в то же время — независимо от любых настроек — удаляет все символы после первой двойной кавычки, так чтоsome "quoted" value
становитсяsome
. По этой причине я боюсь, что патч неприменим в моем случае, но, по крайней мере, я знаю, что это ошибка.