Я мигрирую с PrimeFaces 6.2 на 8.0. В моем проекте я использую несколько Primeface DataTables с Paginator .
MCVE:
Создайте список данных с более чем 10 элементами. Затем кликните по разным номерам страниц. Если щелкнуть или выбрать любой номер страницы больше 10 в JumpToPageDropdown, консоль зарегистрирует следующую ошибку:
Ошибка в консоли Chrome:
jquery.js.xhtml?ln=primefaces&v=8.0:2 Uncaught Error: Syntax error, unrecognized expression: option[value=\31 0]
at Function.se.error (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at se.tokenize (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at se.compile (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at se.select (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at se (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at Function.se.matches (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at Function.k.filter (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at k.fn.init.k.fn.<computed> [as children] (jquery.js.xhtml?ln=primefaces&v=8.0:2)
at c.updateUI (components.js.xhtml?ln=primefaces&v=8.0:58)
at c.updateTotalRecords (components.js.xhtml?ln=primefaces&v=8.0:58)
Используемый компонент:
<p:dataTable id="datatable"value="#{backendController.dataList}"
var="data" paginator="true" rows="1" paginatorPosition="top"
pageLinks="20"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {JumpToPageDropdown} {NextPageLink} {LastPageLink}">
-> Add a few <p:column> tags.
</p:dataTable>
Временное исправление:
Мне удалось определить, что JumpToPageDropdown вызывает ошибку. Когда это удалено из шаблона paginatorTemplate, ошибка больше не будет отображаться при нажатии на страницы больше 10. К сожалению, я хочу использовать это раскрывающееся меню.
Дальнейшие исследования:
PrimeFaces использует эти JS файлы для своих компонентов и, следовательно, также для JumpToPageDropdown:
- PrimeFaces 6.2: компоненты. js .x html? Ln = primefaces & v = 6.2 PrimeFaces
- PrimeFaces 8.0: компоненты. js .x html? Ln = primefaces & v = 8.0
Это соответствующие вызовы для обновления
Both versions:
this.jtpSelect = this.jq.children(".ui-paginator-jtp-select");
PrimeFaces 8.0:
this.jtpSelect.children("option[value=" + $.escapeSelector(this.cfg.page) + "]").prop("selected", "selected")
PrimeFaces 6.2:
this.jtpSelect.children("option[value=" + (this.cfg.page) + "]").prop("selected", "selected")
Разница в версии 8.0 значение this.cfg.page
передается в функцию $.escapeSelector()
.
this.cfg.page
использует нумерацию с нуля. Страница 1 - это 0, страница 10 - это 9 и так далее. В версии 6.2 this.jtpSelect.children()
вызывается с опцией [value = 10], когда выбранная страница равна 11. Но в версии 8.0 $.escapeSelector()
форматирует тот же ввод в \31 0
и приводит к option[value=\31 0]
.
Это приводит к ошибке, упомянутой выше. Смотрите эту строку: Uncaught Error: Syntax error, unrecognized expression: option[value=\31 0]
Рекомендация:
Если это ошибка, $.escapeSelector()
следует удалить из этой функции в PrimeFaces 8.0, очевидно, в этом нет необходимости. для экранирования: экранировать номера не нужно.