当前位置: 首页 > 知识库问答 >
问题:

Primefaces数据表、延迟加载和每行CommandButton

酆鸿哲
2023-03-14

我有一个简单的页面:

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel}" var="elem" lazy="true" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>

DataTable中的CommandButton不起作用,只是刷新页面。但是外面的那个正在工作。

如果我以这种方式更改惰性

<h:form id="form">

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10">
        <p:column headerText="class">#{elem.class.simpleName}</p:column>
        <p:column headerText="code">#{elem.code}</p:column>
        <p:column headerText="description">#{elem.description}</p:column>
        <p:column headerText="action">
            <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit">
                <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/>
            </p:commandButton>
        </p:column>
    </p:dataTable>

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/>

</h:form>

DataTable内部的CommanButton就像一个符咒。

有人知道为什么?

是虫子吗?

我在

  • 玻璃鱼3.1.2
  • JSF 2.1.11(Mojarra)
  • PrimeFaces 3.4-快照

共有2个答案

蒲昊苍
2023-03-14

这个问题发布已经四年了,但问题仍然存在于6.0版。

我将为那些不想(或不能)使用ViewScoped bean的人发布一个解决方案

前提是:“不能将任何“ajaxified”项放在绑定到RequestScoped stuff的惰性数据表中”。从不请记住,抛出ajax调用的任何东西都不会起作用。

因此,第一步是将ajax调用置于datable之外。我们将使用远程通信来做到这一点。您可以将此远程命令放置在DataTable之外的任何位置(当然是在表单中)

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}">
</p:remoteCommand>

现在,我们所要做的就是从DataTable内部调用这个RemoteCommand。我使用一个链接来执行javascript调用,但您可以使用按钮或任何您喜欢的方式:

<p:column>
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])">
    </p:link>
</p:column>

这个链接提供了一种调用javascript函数"Remote teCall"的方法,该函数将执行对"bean.doStuff()"的ajax调用。

注意,onClick事件不仅包含对“remoteCall”的javascript调用,而且还包含一个参数数组,该参数数组只有一个参数,名为“id”,值为“#{item.id}”。这将允许RemoteCommand向支持bean发送一个名为“id”的参数。

在“doStuff”方法中,必须检索“id”参数值:

public void doStuff () {

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");

}
艾令雪
2023-03-14

发现延迟数据模型必须是回发请求上的同一实例,即使是具有相同值的新实例也无法工作。因此,它必须至少从一个@ViewScopedbean提供。

 类似资料:
  • 问题是,每次尝试筛选表时,我的 实现中被重写的方法 都会被调用两次。 我的<代码>LazyDataModel<代码>实现: 我的xhtml视图: 和控制器

  • 我想导出一个在报表生成期间具有LazyLoad数据模型的数据表(带分页)。 问题:当我导出时,报告从数据库逐页生成,然后导出到Excel/PDF,这会消耗更多时间。我想通过跳过逐页生成数据集来在单个数据库访问中获取它。 我生成了如下代码片段: JSF: 受管Bean: 数据模型: 注: < li >没有语法错误。 < li >所有自定义类型类都已定义。 如何通过跳过逐页生成记录来获得Excel报表

  • 我正在使用JSF2。0和PrimeFaces3。1和3。1用于业务逻辑。我试图使用DataTable—延迟加载。但它给了我以下的错误。请帮忙。 发生错误:

  • 我想在primeface可数据延迟加载完成后更新后备bean。我看到API有一个成功 我本可以使用监听器,但问题是监听器甚至在服务器端加载方法完成之前就被调用了。

  • 问题内容: 在我的JSF数据表中,我实现了延迟加载,当我对记录进行分页时,执行下一组记录大约需要4到5秒的时间,实际上执行结果应该少于一秒钟。 这是我实现它的方式所发生的,不确定我该如何解决。 扩展LazyDataModel的DataModel类 和道课 有人可以解释是什么原因导致了记录分页时出现延迟吗? 如果我删除以下内容 并执行,那么它可以完美执行而没有延迟,但是问题始终是5,这是我每页的默认

  • 所以,我有一个这样的日期: 在接收如下参数的页面上: 加载页面时,没有任何问题,一切正常。但当我单击下一页或尝试编辑行时,viewparam中的“必需消息”就会出现。看起来,当数据表上的任何内容发生更改时,param就会消失。 有什么想法吗?非常感谢。