【发布时间】:2023-03-23 07:15:02
【问题描述】:
我的 Primefaces 界面有一个大问题。我想对列表进行循环并显示一些信息+隐藏的编辑字段。
XHTML Primefaces 代码n-p:
<p:dataList value="#{datas}" var="data">
<div class="ui-g">
<div class="ui-g-3">
<h2>#{data.desc}</h2>
</div>
<div class="ui-g-3">
<p:commandButton operation="edit" disabled="#{data.isLocked()}" actionListener="#{view.edit(data)}"
style="width:120px;" update="edit_#{data.id}" />
<p:commandButton operation="delete" actionListener="#{view.delete(data.getId())}" disabled="#{data.isLocked()}"/>
</div>
</div>
<!-- works perfectly to set the id -->
<span id="edit_#{data.id}">#{data.desc} #{index}</span>
<!-- doesnt work - maybe of the rendering moment to set the id? -->
<p:panelGrid id="edit_#{data.id}" rendered="#{view.edit}">
<p:outputLabel for="desc" value="#{msg.text}" />
<p:inputText id="desc" value="#{view.selectedValue.desc}" />
</p:panelGrid>
如果我想编辑该 div,如何为 panelGrid 设置动态 ID 以通过 commandButton click 更新它? + 如何在编辑时切换 div?还是有其他解决方案?我不允许使用 JavaScript/jQuery。
非常感谢!
干杯, JohnRamb0r
【问题讨论】:
-
在您的示例中,您将生成重复的 ID
edit_{data.id}。也许这就是问题所在。您收到错误消息吗?如果您只需要update=的 id,则应将<span和<p:panelGrid放在<h:panelGroup id='edit_#{data.id}'>中并去掉它们的 id。 -
您好,谢谢您的回答。跨度只是一个示例,表明此“解决方案”有效,而 panelGrid 部分无效。我需要渲染选项来更新 panelGrid,因此我想使用它。
-
一个问题是,将(更新)id 放置在具有渲染属性的组件中。如果此组件未呈现,则无法使用 id。正如我所写:您应该将 panelGrid 放在
<h:panelGroup id='edit_#{data.id}'>中,而其他人不必获得相同的 id。 -
现在我删除了 span 标签并将 panelGrid 包装在一个 panelGroup 中。输出也相同:
Cannot find component for expression "edit_1" referenced from "main:j_idt70:0:j_idt122".更新语句正在寻找“edit_1”,但面板网格的 id 由 Primefaces 生成:“main:j_idt70:0:edit_”。但我希望 panelGrid 应该具有相同的 id --> 例如 edit_1 。 -
嗯,是的,它在dataList里面。因为 dataList 自己生成 id
:0你不需要使用动态 id。只需使用即editbox。它将更改为main:j_idt70:x:editbox,其中 x 是 dataList 的行索引。没有:的亲戚update='editbox'应该会找到它。
标签: jsf primefaces