Primefaces数据表,延迟加载和命令按钮每行(Primefaces DataTable, la

2019-06-26 23:24发布

我有这个简单的页面:

<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>

CommandButton里面DataTable不工作,只是刷新页面。 但一个外工作。

如果我改变valuelazy是这样的:

<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>

CommanButton里面DataTable就像一个魅力。

有人知道这是为什么?

它是一个错误吗?

我上线了

  • Glassfish的3.1.2
  • JSF 2.1.11(钻嘴鱼科)
  • PrimeFaces 3.4快照

Answer 1:

发现了懒惰的数据模型必须是在回发请求相同的情况下,即使有非常相同的值一个新的实例将无法正常工作。 所以它必须至少提供@ViewScoped豆。



Answer 2:

四年过去了,因为这个问题被张贴,但问题仍然存在EN PrimeFaces 6.0。

我要发布一个解决办法对那些谁不想(或不能)使用ViewScoped豆。

前提是:“你不能把任何‘Ajax化’项目必将RequestScoped东西,一个懒惰的数据表内”。 决不。 请恩记住,任何抛出一个Ajax调用不会有任何效果。

所以第一步就是要把数据表外Ajax调用。 我们将使用RemoteComand做到这一点。 您可以在任何地方把这个RemoteCommand数据表外(一个形式里面,当然)

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

现在,我们需要做的是从数据表中调用这个RemoteCommand。 我使用的链接来执行的JavaScript调用,但你可以使用一个按钮或任何你喜欢:

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

此链接提供了一种方法来调用JavaScript函数“为RemoteCall”将执行的Ajax调用“bean.doStuff()”。

需要注意的是onClick事件不会只包含的JavaScript调用“为RemoteCall”,但它也包含一个参数数组只有一个PARAM,命名为“ID”与价值“#{} item.id”。 这将允许RemoteCommand发送一个名为“ID”的支持bean PARAM。

里面的“doStuff”方法,你必须检索“ID”参数值:

public void doStuff () {

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

}


文章来源: Primefaces DataTable, lazy loading and CommandButton per row