在我使用渲染时间标记(如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表达式。什么是解决方法?非常感谢。
答案 0 :(得分:2)
您不应该尝试将任何ManagedBean逻辑或EL表达式建立在重复组件(如<ui:repeat>
或<c:forEach>
)的生成ID上。就像您已经提到的那样,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}" ...
在操作方法中,我们可以通过检索动态组件属性来确定要执行的操作或业务逻辑。
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...
}