首页 > 解决方案 > 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>

我一直在方法中填充someListSpecificToThisUserselectItems 列表@PostConstruct init()

@PostConstruct
public void init() {
     //code specific to the page and datatable
     someListSpecificToThisUser = service.queryValuesForUser(user);
}

但是如果用户从不单击单元格来编辑 selectOneMenu 值,那么我会点击数据库并将列表无缘无故地存储在内存中。还是我不应该担心开销?

标签: jsfprimefacesprimefaces-datatable

解决方案


如果对 a 进行单元格编辑,p:dataTable您可以使用一些事件:

事件 被解雇
单元格编辑 编辑单元格时。
单元格编辑取消 当单元格编辑被取消时,例如使用转义键
单元格编辑初始化 当单元格编辑开始时。

都以 aorg.primefaces.event.CellEditEvent作为监听器参数。

您可以cellEditInit在列表静止时使用该方法填充列表null。缺点是这需要在每次编辑初始化时调用 Ajax。

您还有一个选择是将列表存储在SessionScoped用户 bean 中,这将花费您一些内存。

选择的选项取决于列表的大小、获取列表所需的时间以及您期望的编辑次数。如果您不希望进行太多编辑,请使用 Ajax 侦听器来填充列表。如果列表很长并且需要一些时间来加载,我会切换到一个p:autoComplete字段。

也可以看看:


推荐阅读