【发布时间】:2011-04-27 17:22:18
【问题描述】:
我知道prependId="false" 做了什么。它设置了标志,以便表单的 id 不会在表单子表单的 id 前面,但为什么呢?有什么特别的原因为什么你要或不想在前面加上 id?
【问题讨论】:
-
相关:stackoverflow.com/questions/7415230/… tl;dr:永远不要使用它。
标签: jsf
我知道prependId="false" 做了什么。它设置了标志,以便表单的 id 不会在表单子表单的 id 前面,但为什么呢?有什么特别的原因为什么你要或不想在前面加上 id?
【问题讨论】:
标签: jsf
根据我的经验,我从不使用此属性。但是,在某些情况下它可能很有用。
当您使用 Facelets 时,您可以创建模板或在另一个页面中包含页面。所以你可以想象一个页面可以包含在几个不同的页面中。以父页面包含form的例子为例:
第 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>
【讨论】:
this 关键字,则可以简化 JS 访问:)
我更喜欢偶尔添加 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 预处理器配合使用。
【讨论】:
除了使 CSS 选择器更容易之外,使用 prependId=false 还可以更轻松地使用 JavaScript 和 jQuery 访问特定元素。
否则,在不使用 RichFaces 的情况下,要使用 jQuery 通过 id 获取元素,您将不得不使用丑陋的转义序列,例如:
jQuery("form-id\\:element-id")
【讨论】:
$(.myClass) 访问属性。
如果您使用 Spring Security,则在登录表单中 prependId=false 很有用,因为输入文本的 id 必须恰好是“j_username”和“j_password”。因此,您不应该将表单 id 放在它们之前,使用 prependId=false 是实现这一点的不错选择。
【讨论】:
我们必须设置此标志的一种情况是 Primefaces 库的自动完成控制。
当我尝试对 primefaces 库进行自动完成控制时,我必须将此标志设置为 false。我无法让自动完成工作,但在设置此标志后它工作正常。你可以看到我关于这个问题的问题的链接
WARN [Parameters] Parameters: Invalid chunk ignored. warning coming in primefaces application
【讨论】: