JSF: Почему prependId = false в форме?

Я знаю, что делает prependId=false. Он устанавливает флаг так, чтобы идентификатор формы не добавлял идентификатор дочернего элемента формы, но почему? любая конкретная причина, по которой вы делаете или не хотите добавлять id?

Ответ 1

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

Когда вы используете Facelets, вы можете создавать шаблоны или включать страницы на другой странице. Таким образом, вы можете себе представить, что страница может быть включена в несколько разных страниц. Возьмем пример, где родительские страницы содержат form, с другим id:

Страница 1:

<h:form id="form1">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>

Страница 2:

<h:form id="form2">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>

Теперь в my-page.xhtml у вас есть <h:inputText id="foo"/>. В первом случае реальный идентификатор входа будет form1:foo, а во втором случае он будет form2:foo. Это может создать сложные ситуации, если вам нужен прямой доступ к этому компоненту в Javascript или на Java (с использованием метода findComponent("...")).

Если вы используете prependId="false" (или некоторые компоненты forceId="true"), реальный идентификатор будет просто foo, а затем ваш код будет проще, так как вам не нужно будет заботиться о контейнере поля ввода.

Однако вам придется использовать этот атрибут осторожно, так как вы можете получить дублируемую идентификационную ошибку, если вы слишком часто используете этот атрибут prepend...

Ответ 2

Ситуация, в которой prependId = false полезна, находится в форме входа в систему, если вы используете Spring Security, потому что идентификаторы входных текстов должны быть точно "j_username" и "j_password". Поэтому вы не должны ставить перед ними идентификатор формы, и использование prependId = false - хороший выбор для достижения этой цели.

Ответ 3

Я предпочитаю иногда добавлять preendId, чтобы упростить стилизацию элементов с помощью классов ID. Например, форма:

<h:form id="myform" ... >
    <h:inputText id="mytext" ... />
</h:form>

Дает вам идентификатор myform:mytext. Поскольку двоеточие зарезервировано в CSS, вам нужно избегать CSS, чтобы читать что-то вроде #myform\:mytext { ... }, которое я предпочитаю не делать. С prependId="false" я использую только #mytext { ... }, который намного проще и приятнее читать. Он также отлично работает с препроцессорами CSS, такими как LESS или Sass.

Ответ 4

В дополнение к упрощению выбора селекторов CSS использование prependId=false упрощает использование JavaScript и jQuery для доступа к определенным элементам.

В противном случае, не используя RichFaces, чтобы получить доступ к idmement с помощью jQuery, вам придется использовать уродливую escape-последовательность, например:

jQuery("form-id\\:element-id")

Ответ 5

Один сценарий, в котором мы должны установить этот флаг, - это в случае управления Autocomplete библиотеки прайс-листов.

Мне нужно было установить этот флаг в false, когда я пытался автозаполнять управление библиотекой прайв. Я не смог получить автозаполнение, но после установки этого флага он работал нормально. Вы можете увидеть эту ссылку на мой вопрос относительно этой проблемы.

WARN [Параметры] Параметры: Неверный фрагмент игнорируется. предупреждение, поступающее в приложение "Поверхности"