【问题标题】:How to target the specific JSF component with unique id?如何定位具有唯一 ID 的特定 JSF 组件?
【发布时间】:2013-01-09 13:57:06
【问题描述】:

就我而言,我想刷新 ID 为 baseTab 的组件。如果表单main 和tabView tabs,则它本身包含在其中。对组件的绝对引用是main:tabs:baseTab。这就是我需要在更新属性中引用的内容:

 <p:commandButton update="main:tabs:baseTab"/>

这种完整 ID 的问题在于它很长,并且当我更改组件层次结构中的某些内容时可以轻松更改。 ID baseTab 本身是唯一的,所以至少在理论上,我应该能够直接引用这个组件。但是我该怎么做呢?

通过唯一 ID 引用组件的语法是什么?我尝试了以下方法:

  • :baseTab
  • baseTab
  • main:baseTab
  • :tabs:baseTab

这些都不起作用,每个都导致页面错误,即此类组件不存在......

【问题讨论】:

  • 您只能通过 ID 直接引用组件,它们至少必须具有相同的父表单。我想这会对性能产生一些影响,Dom 处理器必须通过 DOM 树来梳理 id 而不是直接引用
  • 它与 DOM 性能没有任何关系。整个 jQuery 是基于 DOM 搜索的,通过 ID 搜索,无论是否唯一,都是极快的操作。
  • 您的commandButton 在此层次结构中的哪个位置?它在那个标签里吗?
  • 不,它在 mainForm 中的某个地方

标签: jsf jsf-2 primefaces


【解决方案1】:

我可以看到不进行此引用的价值取决于组件树结构。

应该可以为此利用组件绑定,因为update 可以采用ValueExpression

使用(例如)faces-config.xml 在请求范围内定义地图:

<managed-bean>
  <managed-bean-name>bind</managed-bean-name>
  <managed-bean-class>java.util.HashMap</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

将目标绑定到地图:

<h:foo binding="#{bind.someIdForBinding}" />

在您的按钮中引用此控件的客户端标识符:

<p:commandButton update=":#{bind.someIdForBinding.clientId}"/>

创建/恢复树时,目标组件将被放入绑定映射中。

请注意,此代码未经测试。

【讨论】:

  • 这是一种有趣的方法,但它只需要创建 bean 来存储绑定。无论如何它不会使引用变短,但也许当组件结构非常深且非常动态时,这将是不可避免的。
  • McDowell,update 属性仍然需要以: 为前缀,以使其绝对化。它不是客户端 ID 的一部分。
  • @BalusC 啊。修正;同样,不知道这在实践中是否有效。
  • McDowell,是的,它在实践中有效。我之前什至多次回答过这种方法。顺便说一下,map bean 不是强制性的,但它使代码更具自我记录性(但我宁愿称它为 components,而不是 bind)。
  • @lechlukasz 重点不是让表达式更短;它是停止影响引用的树结构更改。您可以通过直接绑定到请求映射(例如#{requestScope.someIdForBinding})来避免创建 bean,但这会增加与其他请求范围工件发生冲突的机会。
【解决方案2】:

除非您的组件在同一个父级中,否则不要认为这是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多