【发布时间】:2013-12-16 16:52:24
【问题描述】:
我有一个数据表,其中包含删除行的按钮,之后我想刷新该表。除了删除最后一项的情况外,刷新工作正常。我相信这是因为 rendered 属性在 ajax 更新时行为不端。
这一切都在一个复合组件中,数据表是有条件地呈现的,它看起来像这样:
<p:dataTable id="#{cc.attrs.id2}_resultTable"
value="#{cc.attrs.listData}"
var="f"
rendered="#{cc.attrs.list and not empty cc.attrs.listData}"
rowKey="#{f.code}">
...columns
<p:column>
<p:commandButton action="#{myBB.removeItem}"
update="#{cc.attrs.id2}_resultTable">
<f:setPropertyActionListener value="#{f}" target="#{myBB.selected}"/>
</p:commandButton>
</p:column>
</p:dataTable>
这很好用,除非我从列表中删除最后一项(并希望表格消失)。通过 ajax 显示表格不是问题,因为我添加的项目也没有提交,并且表格在添加第一个项目后正确显示。
我试图用 ID 将表格括在 h:panelgroup id="#{cc.attrs.id2}_resultPanel" 中并更新它,但我得到了这个异常:
Cannot find component with expression "test_resultPanel"
referenced from "mainForm:j_idt111:test_resultTable:0:j_idt187".
我也许可以使用组件的完整路径,但这有点问题,因为它是一个复合组件。
有趣的想法是,更新是从表格外部进行的。但是当我将它移到表格中的列时,它没有。
【问题讨论】:
-
您可以将
<p:dataTable>放在<h:panelGroup layout="block" id="tableDiv">中并尝试更新 div 即tableDiv而不是<p:dataTable> -
Diganta:我试过了(见问题结尾)
-
您可以通过
:j_idt111:test_resultTable这种方式更新复合组件。用你自己的id替换生成的id -
这个 j_idt111 在复合组件之外,所以我无法控制它。但无论如何它不起作用。看起来好像我无法在更新中引用除表本身之外的任何内容:```无法找到从“mainForm:j_idt128:test_resultTable:0:j_idt145”引用的表达式“:j_idt128:test_resultTable”的组件。```跨度>
-
我认为问题在于,当执行操作并更新数据时,commandButton 不再出现在视图中。
标签: ajax jsf primefaces