jsf - Primefaces 数据表 actionListener 用于内联单元格编辑
问题描述
当用户单击数据表中的单元格时如何执行代码?类似于 a 上的 listener 和 actionListener p:commandButton
。
例如
<p:commandButton oncomplete="PF('editProductDialog').show()"
actionListener="#{bean.doStuffToGetASelectOneMenuReadyforTheEditProductDialog()}" />
public void doStuffToGetDialogReady() {
//query databases to get select item list
}
仅当/如果用户单击命令按钮时才查询数据库
但是对于 p:dataTable 内联单元格编辑,我如何调用仅在单击数据表单元格进行编辑时才会查询数据库以获取选择项的代码?
<p:cellEditor>
<f:facet name="output"/>
<f:facet name="input">
<p:selectOneMenu>
<f:selectItems value="#{bean.someListSpecificToThisUser}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
我一直在方法中填充someListSpecificToThisUser
selectItems 列表@PostConstruct init()
@PostConstruct
public void init() {
//code specific to the page and datatable
someListSpecificToThisUser = service.queryValuesForUser(user);
}
但是如果用户从不单击单元格来编辑 selectOneMenu 值,那么我会点击数据库并将列表无缘无故地存储在内存中。还是我不应该担心开销?
解决方案
如果对 a 进行单元格编辑,p:dataTable
您可以使用一些事件:
事件 | 被解雇 |
---|---|
单元格编辑 | 编辑单元格时。 |
单元格编辑取消 | 当单元格编辑被取消时,例如使用转义键 |
单元格编辑初始化 | 当单元格编辑开始时。 |
都以 aorg.primefaces.event.CellEditEvent
作为监听器参数。
您可以cellEditInit
在列表静止时使用该方法填充列表null
。缺点是这需要在每次编辑初始化时调用 Ajax。
您还有一个选择是将列表存储在SessionScoped
用户 bean 中,这将花费您一些内存。
选择的选项取决于列表的大小、获取列表所需的时间以及您期望的编辑次数。如果您不希望进行太多编辑,请使用 Ajax 侦听器来填充列表。如果列表很长并且需要一些时间来加载,我会切换到一个p:autoComplete
字段。
也可以看看:
推荐阅读
- php - Telegram API - 从 Telegram Group 中的垃圾邮件机器人中删除未知垃圾邮件
- lua - roblox 工作室 plr.Name == ""
- menu - Flutter中带有3页的自定义网格菜单
- idris - 伊德里斯:证明复数乘法是结合的
- android - 是否有任何监听器可以从手机存储中删除操作?
- android - 特定行的数据库查询
- bash - 用不同的随机字符替换十六进制字符(可以使用 awk 吗?)
- php - 使用 eloquent un laravel 后显示 Empty
- php - Symfony4 docker原则不创建数据库
- html - 放大图像时不缩放 img 父级的宽度