JSF:为什么在表单中prependId = false?

Tha*_*ham 31 jsf

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

Rom*_*las 40

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

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

第1页:

<h:form id="form1">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>
Run Code Online (Sandbox Code Playgroud)

第2页:

<h:form id="form2">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>
Run Code Online (Sandbox Code Playgroud)

现在,在my-page.xhtml,你有一个<h:inputText id="foo"/>.在第一种情况下,输入的实际ID将是form1:foo,而在第二种情况下,它将是form2:foo.如果您需要在Javascript或Java(使用findComponent("...")方法)中直接访问此组件,则可能会出现复杂情况.

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

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

  • 同意.但是,如果你以聪明的方式使用`this`关键字,可以简化JS访问:) (7认同)

cho*_*o70 8

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


Lee*_*ald 7

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

<h:form id="myform" ... >
    <h:inputText id="mytext" ... />
</h:form>
Run Code Online (Sandbox Code Playgroud)

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

  • 另一种方法是使用javax.faces.SEPARATOR_CHAR - 这允许您使用另一个分隔符而不是":". (5认同)