我知道prependId="false"
做了什么。它设置了标志,以便表单的id不会添加表单子的id,但为什么呢?你为什么或者不想加前缀ID的任何特殊原因?
根据我的经验,我从不使用这个属性。但是,在某些情况下它可能很有用。
使用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>
如果使用Spring Security,则prependId = false有用的情况是在登录表单中,因为inputtexts的id必须是“j_username”和“j_password”。所以你不应该在它们之前放置表单id,并且使用prependId = false是一个很好的选择来实现它。
我更喜欢偶尔添加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预处理器。
我们必须设置此标志的一种情况是在自动完成控制primefaces库的情况下。
当我尝试自动完成对primefaces库的控制时,我不得不将此标志设置为false。我无法使自动完成工作,但设置此标志后它工作正常。您可以看到有关此问题的问题的链接
WARN [Parameters] Parameters: Invalid chunk ignored. warning coming in primefaces application
除了使CSS选择器更容易之外,使用prependId=false
还可以更轻松地使用JavaScript和jQuery来访问特定元素。
否则,在不使用RichFaces的情况下,使用jQuery通过id获取elmement,你将不得不使用一个丑陋的转义序列,如:
jQuery("form-id\\:element-id")