【问题标题】:Why prependId="false" in a jsf form?为什么 prependId="false" 在 jsf 表单中?
【发布时间】:2011-04-27 17:22:18
【问题描述】:

我知道prependId="false" 做了什么。它设置了标志,以便表单的 id 不会在表单子表单的 id 前面,但为什么呢?有什么特别的原因为什么你要或不想在前面加上 id?

【问题讨论】:

标签: jsf


【解决方案1】:

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

当您使用 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 中,您有一个&lt;h:inputText id="foo"/&gt;。在第一种情况下,输入的真实 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="true" 时,组件 ID 以 formName 为前缀。如果您在同一个 .xhtml 文件中有两个不同形式的多个具有相同 id 的组件,这将非常有用。
【解决方案2】:

我更喜欢偶尔添加 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 预处理器配合使用。

【讨论】:

  • 另一种方法是使用 javax.faces.SEPARATOR_CHAR - 这允许您使用另一个分隔符而不是“:”。
  • 为了澄清:@Lee Theobald 在说“作为分号......”时显然是指“冒号”。
  • 我做到了。适当地修正了答案。
  • @Lee Theobald,在你的回答中,它不应该是 prependId="false" 来获取#mytext 还是正确的,因为AFAIK prependId="true" 是默认的?请澄清
  • 是的,你是对的。我设法在这个答案中打了很多错字!重点是:) 我会适当地纠正它。
【解决方案3】:

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

否则,在不使用 RichFaces 的情况下,要使用 jQuery 通过 id 获取元素,您将不得不使用丑陋的转义序列,例如:

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

【讨论】:

  • 使用 CSS 伪类。 JSF 从不修改类名,因此您可以简单地使用 $(.myClass) 访问属性。
【解决方案4】:

如果您使用 Spring Security,则在登录表单中 prependId=false 很有用,因为输入文本的 id 必须恰好是“j_username”和“j_password”。因此,您不应该将表单 id 放在它们之前,使用 prependId=false 是实现这一点的不错选择。

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 2011-11-16
      • 1970-01-01
      • 2013-06-04
      • 2015-09-30
      • 1970-01-01
      • 2015-08-19
      • 2022-01-10
      相关资源
      最近更新 更多