仅在验证成功时才更新Primefaces DataTable

时间:2013-07-08 08:28:49

标签: jsf jsf-2 primefaces

让我们说一个例子,我有一些输入字段,如

<p:panel id="panel" closable="false" toggleOrientation="horizontal" toggleable="true" header="New">
    <p:focus context="panel"/>
    <p:watermark for="txtCountryName" value="Enter a valid country name."/>
    <p:watermark for="txtCountryCode" value="Enter a valid country code."/>
    <p:messages id="systemMessages" globalOnly="true" redisplay="false" showDetail="true" showSummary="true" autoUpdate="false" closable="true"/>
    <p:messages id="specificSystemMessages" for="paramId" globalOnly="false" redisplay="false" showDetail="true" showSummary="false" autoUpdate="false" closable="true"/>

        <h:panelGrid id="panelGrid" columns="3" cellpadding="5">
            <p:outputLabel for="txtCountryName" value="Country"/>
            <p:inputText id="txtCountryName" value="#{countryManagedBean.txtCountryName}" label="Country name" required="true" maxlength="45">
                <f:validateLength minimum="2" maximum="45"/>
            </p:inputText>
            <p:message for="txtCountryName" showSummary="false"/>

            <p:outputLabel for="txtCountryCode" value="Country Code"/>
            <p:inputText id="txtCountryCode" value="#{countryManagedBean.txtCountryCode}" required="true" maxlength="45" label="Country code">
                <f:validateLength minimum="2" maximum="45"/>
            </p:inputText>
            <p:message for="txtCountryCode" showSummary="false"/>


            <p:commandButton id="btnSubmit" update="dataTable panel messages" actionListener="#{countryManagedBean.insert}" icon="ui-icon-check" value="Save"/>
</h:panelGrid>
</p:panel>

DataTable如下。

<p:panel id="dataTablePanel" toggleable="true" toggleOrientation="horizontal" closable="false" header="Data">
    <p:dataTable id="dataTable" var="row" value="#{countryManagedBean}"
                 lazy="true"
                 pageLinks="10"
                 paginator="true"
                 sortMode="multiple"
                 resizableColumns="true"
                 sortOrder="descending"
                 editable="true"
                 filterEvent="keyup"
                 selection="#{countryManagedBean.selectedValues}"
                 rowsPerPageTemplate="5,10,15"
                 rows="10"
                 rowKey="#{row.countryId}"
                 rowIndexVar="rowIndex"
                 rowStyleClass="#{row.countryId eq countryManagedBean.id? 'selected-data-row' : null}"
                 editMode="row">


                 ...
                 ...
                 ...
    </p:dataTable>
</p:panel>

当这个命令按钮时,

<p:commandButton id="btnSubmit" update="dataTable panel messages" actionListener="#{countryManagedBean.insert}" icon="ui-icon-check" value="Save"/>
单击

,如果一行满足所有验证规则并且使用update="dataTable panel messages"属性更新DataTable,则会向基础数据库添加一行。

当且仅当满足这些输入字段中指定的所有验证条件并且实际创建了行时,我想更新此DataTable。

如果这些验证规则中的任何一个失败,则不应再更新此DataTable,这是非常不必要的,并导致执行一些昂贵的JPA标准和/或JPQL查询。这可能吗,怎么样?

这是Primefaces 3.5。

2 个答案:

答案 0 :(得分:3)

在这种情况下尝试使用remotecommand。 更改您的提交按钮,如下所示。

<p:commandButton id="btnSubmit" action="#{countryManagedBean.insert}" icon="ui-icon-check" value="Save" oncomplete="handleRequest(xhr, status, args)"/>

添加p:remoteCommand,如下所示。

<p:remoteCommand name="updateTable" update="dataTable">

此远程命令将用于更新您的表格。

是的,请在下面添加js。

<script type="text/javascript">  
        function handleRequest(xhr, status, args) {  
            if(!args.validationFailed) {  
                updateTable();
                }   
           }  
    </script> 

HTH

答案 1 :(得分:0)

尝试在插入函数结束时或者在检查验证时将此代码添加到您的bakedbean countryManagedBean。

RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("validationFailed", "true");

这会创建使用javascript检查的回调参数。