1

在我一直使用渲染时间标签(如 a4j:repeat、ui:repeat)之前,基于项目集合创建面板。所有这些都改变了,现在我必须使用 c:forEach 来代替。在每个面板上,我都会进行大量 AJAX 调用和页面的部分更新。这就是为什么我使用自定义 ID 来识别我想要更新的组件。所以我的渲染属性是这样的:

#{cc.clientId}:pnlRepeat:#{row}:radioAplicar

其中 pnlRepeat 是 id 属性,{#row} 是同一标签中的 rowKeyVar 属性。现在......当使用 c:forEach 时它们都不存在,因此,我得到了重复的 id 异常。我知道我可以使用 varStatus,并使用 #{row} Id 创建一个面板,但另一方面。JSF 不允许 id 属性评估 EL 表达式。什么是解决方法?非常感谢。

4

1 回答 1

2

您不应尝试将任何 ManagedBean 逻辑或 EL 表达式基于生成的重复组件的 ID,如<ui:repeat>or <c:forEach>。就像您已经提到的那样,EL 表达式不会让您动态评估 Id 表达式,因此处理重复组件中的单个项目触发事件的这些情况的适当方法是以以下形式传递唯一标识值<f:attribute>标签。

使用<f:attribute>标签会将指定的值放入请求属性中,以便可以在您的操作侦听器中检索它。

<ui:repeat value="..." var="repeatedVar">
  <h:inputText id="newTxt" value="#{repeatedVar}" >
     <f:attribute name="unique_id" value="#{repeatedVar.uniqueId}" />
  </h:inputText>
</ui:repeat>
<h:commandButton actionListener="#{managedBean.someMethod}" ...

在 action 方法中,我们可以通过检索动态组件属性来确定要执行的操作或业务逻辑。

public void someMethod() {
    String uniqueId = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("unique_id");
    //Get the unique data object
    //Do some business logic and other stuff...
}
于 2012-07-12T11:54:25.087 回答