考虑一个虚拟案例:
<h:form id="wrapperForm">
<h:panelGroup id="rowsContainer">
<h:dataTable id="rowsTable" value="#{bean.rows}" var="row" >
<h:column>
<h:commandButton value="Click me to update (#{component.parent.parent.parent.clientId})">
<f:ajax render=":#{component.parent.parent.parent.clientId}" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:panelGroup>
</h:form>
点击按钮,id=rowsContainer
成功更新。
但是,如果我在那里添加ui:repeat
,它就不再起作用了:
<h:form id="wrapperForm">
<ui:repeat id="blocksRepeat" var="block" value="#{bean.blocks}">
<h:panelGroup id="rowsWrapper">
<h:dataTable id="rowsTable" value="#{block.rows}" var="row" >
<h:column>
<h:commandButton value="Click me 2 update (#{component.parent.parent.parent.clientId})">
<f:ajax render=":#{component.parent.parent.parent.clientId}" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:panelGroup>
</ui:repeat>
</h:form>
相反,这得到:
<f:ajax> contains an unknown id ':wrapperForm:blocksRepeat:0:rowsWrapper' - cannot locate it in the context of the component j_idt363
但是,该组件确实存在该ID,因此EL应该没问题。不知怎的,ui:repeat
打破了这个案子。是否可能在实际循环之前尝试评估EL?
如何引用dataTable中的rowsWrapper
元素?
注意:我最近询问了odd dataTable naming within ui:repeat,turned out to be a bug。但是,这个问题与此无关,因为我按照建议here将dataTable包装在panelGroup中。
答案 0 :(得分:3)
实际上有两件事出了问题:
1)ui:重复被打破
正如BalusC在该问题的评论中所回答的那样,由于a bug in Mojarra,第一个问题(再一次)发生了。即使包含ui:repeat
的包装容器也没有帮助,h:dataTable
似乎已经破碎了。有关详细信息,请参阅问题“Why doesn't h:dataTable inside ui:repeat get correct ID?”以及此问题的评论。
正如BalusC所建议的,解决方法是使用h:dataTable而不是ui:repeat
。它将提供不方便的(<table>
)HTML但有效。这在向内部迭代添加行或从内部迭代中删除行时消除了一些奇怪的问题。
注意:关于ui:repeat
的一些问题似乎在Mojarra 2.0.3中得到修复,但并非全部。
2)引用失败
即使使用h:dataTable
解决方法,内部按钮对内部h:dataTable
的引用也会失败。由于没有使用ui:repeat
,这必须是数据表的内部问题。我目前没有看到任何解决方案,所以我filed a ticket for this behavior as well。