使用p:remoteCommand更新p:dataTable

时间:2014-05-03 10:53:16

标签: jsf primefaces jsf-2.2 remotecommand

鉴于以下XHTML代码中只有一个<p:inputText><p:dataTable>只有两列。

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

<p:panel id="panel">
    <p:inputText id="txtValue" value="#{testManagedBean.txtValue}"
                 required="true"/>
    <p:message for="txtValue" showSummary="false"/>
    <p:commandButton actionListener="#{testManagedBean.submitAction}"
                     oncomplete="if(!args.validationFailed) {updateTable();}" 
                     update="panel" value="Submit"/>
</p:panel>

<p:panel id="dataTablePanel" header="Data">
    <p:dataTable id="dataTable" var="row" value="#{testManagedBean}"
                 lazy="true"
                 pageLinks="10"
                 editable="true"
                 rowsPerPageTemplate="5,10,15"
                 rows="10"
                 rowKey="#{row.catId}"
                 editMode="row">

        <p:ajax event="rowEdit" update=":form:panel dataTable"
                listener="#{testManagedBean.onRowEdit}"/>

        <p:column id="id" headerText="Id">
            <h:outputText value="#{row.catId}"/>
        </p:column>

        <p:column id="catName" headerText="Category">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{row.catName}"/>
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{row.catName}" label="Category">
                        <f:validateLength minimum="2" maximum="45"/>
                    </p:inputText>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Edit" width="100">
            <p:rowEditor/>
        </p:column>
    </p:dataTable>
</p:panel>

当按下给定的<p:commandButton>时,会调用关联的侦听器submitAction(),并且只有在验证成功时才会<p:dataTable> 更新<p:remoteCommand>

执行此操作后,如果更新了给定<p:dataTable>所持有的行(反过来,<p:panel id="panel">内的<p:ajax>更新<p:dataTable>。有时需要这样做,<p:inputText>中的给定<p:panel id="panel">会导致验证其边框变为红色,这意味着违反了应该的相关验证。

如果删除了<p:remoteCommand>并且更改了给定的<p:commandButton>,则如下所示

<p:commandButton actionListener="#{testManagedBean.submitAction}"
                 update="panel dataTable" value="Submit"/>

删除oncomplete="if(!args.validationFailed) {updateTable();}"

并且update属性已从update="panel"更改为update="panel dataTable",当<p:inputText>中的行更新时,<p:dataTable>不会导致验证。

当使用<p:inputText>更新<p:dataTable>中的行时,如何阻止<p:ajax>执行验证,而<p:panel>依次更新<p:inputText> <p:remoteCommand>问题

<p:dataTable>本身在这种情况下,不能省略。仅在未违反任何验证时才需要更新@ManagedBean @ViewScoped public final class TestManagedBean extends LazyDataModel<Category> implements Serializable { @EJB private final CategoryBeanLocal categoryService = null; private String txtValue; //Getter and setter. private static final long serialVersionUID = 1L; @Override public List<Category> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) { setRowCount(categoryService.rowCount().intValue()); return categoryService.getList(first, pageSize, multiSortMeta, filters); } public void submitAction() { System.out.println("txtValue : " + txtValue); txtValue = null; } public void onRowEdit(RowEditEvent event) { System.out.println("onRowEdit() called."); } } 。否则,即使存在验证错误,也会不必要地执行昂贵的业务服务。


关联的JSF托管bean(虽然完全没必要)。

{{1}}

1 个答案:

答案 0 :(得分:5)

  

执行此操作后,如果更新了给定<p:dataTable>所持有的行(反过来,<p:panel id="panel">内的<p:ajax>更新了<p:dataTable>。有时必要),<p:inputText>中的给定<p:panel id="panel">会导致验证其边框变为红色,这意味着违反了应该的相关验证。

这不是正在发生的事情。如果这是真的,您在网络监视器中看到了3个HTTP请求。但是只有2个(一个来自小组的提交,另一个来自<p:remoteCommand>)。

原因是<p:remoteCommand>本身。其process属性defaults@all(“整个视图”)。您还可以通过检查网络监视器中的javax.faces.partial.execute请求参数来确认这一点。它说@all。换句话说,整个表单也会被提交/处理,包括那些空输入。

您需要将其明确设置为@this

<p:remoteCommand name="updateTable" process="@this" update="dataTable"/>