为什么以jsf形式prependId =“false”?

问题描述 投票:31回答:5

我知道prependId="false"做了什么。它设置了标志,以便表单的id不会添加表单子的id,但为什么呢?你为什么或者不想加前缀ID的任何特殊原因?

jsf
5个回答
40
投票

根据我的经验,我从不使用这个属性。但是,在某些情况下它可能很有用。

使用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"/>。在第一种情况下,输入的实际ID将是form1:foo,而在第二种情况下,它将是form2:foo。如果您需要在Javascript或Java中直接访问此组件(使用findComponent("...")方法),则可能会出现复杂情况。

如果您使用prependId="false"(或某些组件forceId="true"),真正的ID将只是foo,然后您的代码将更简单,因为您不必关心输入字段的容器。

但是,您必须仔细使用此属性,因为如果您经常使用此prepend属性,则可能会出现重复的ID错误...

在现代的jsf版本中,它也可能会破坏ajax,请参阅UIForm with prependId="false" breaks <f:ajax render>


8
投票

如果使用Spring Security,则prependId = false有用的情况是在登录表单中,因为inputtexts的id必须是“j_username”和“j_password”。所以你不应该在它们之前放置表单id,并且使用prependId = false是一个很好的选择来实现它。


7
投票

我更喜欢偶尔添加prependId来更容易地通过他们的ID类创建样式元素。例如,表格:

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

会给你一个myform:mytext的ID。由于冒号是在CSS中保留的,你必须逃避CSS才能读取像#myform\:mytext { ... }这样我不想做的事情。使用prependId="false",我只使用#mytext { ... },它更简单,更好阅读。它还可以使用像LESS或Sass这样的CSS预处理器。


2
投票

我们必须设置此标志的一种情况是在自动完成控制primefaces库的情况下。

当我尝试自动完成对primefaces库的控制时,我不得不将此标志设置为false。我无法使自动完成工作,但设置此标志后它工作正常。您可以看到有关此问题的问题的链接

WARN [Parameters] Parameters: Invalid chunk ignored. warning coming in primefaces application


2
投票

除了使CSS选择器更容易之外,使用prependId=false还可以更轻松地使用JavaScript和jQuery来访问特定元素。

否则,在不使用RichFaces的情况下,使用jQuery通过id获取elmement,你将不得不使用一个丑陋的转义序列,如:

jQuery("form-id\\:element-id")
© www.soinside.com 2019 - 2024. All rights reserved.