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

时间:2010-10-19 20:51:06

标签: jsf

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

5 个答案:

答案 0 :(得分:40)

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

使用Facelets时,您可以创建模板或在其他页面中包含页面。所以你可以想象一个页面可以包含在几个不同的页面中。以父页面包含form的示例为例,其中包含不同的ID:

Page 1

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

Page 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>

答案 1 :(得分:8)

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

答案 2 :(得分:7)

我更喜欢偶尔添加prependId,以便通过ID类更轻松地创建样式元素。例如,表格:

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

会为您提供myform:mytext的ID。由于冒号是在CSS中保留的,你必须转义CSS才能阅读#myform\:mytext { ... }之类的内容,我不想这样做。使用prependId="false",我只使用#mytext { ... },这更加简单&amp;更好阅读。它还可以使用像LESS或Sass这样的CSS预处理器。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:2)

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

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

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