【问题标题】:Using a p:remoteCommand to update a p:dataTable使用 p:remoteCommand 更新 p:dataTable
【发布时间】:2014-05-03 10:53:16
【问题描述】:

给定以下 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>

当给定的&lt;p:commandButton&gt;被按下时,关联的监听器submitAction()被调用,最后&lt;p:dataTable&gt;&lt;p:remoteCommand&gt;更新只有在验证成功时

执行此操作后,如果给定 &lt;p:dataTable&gt; 持有的行被更新(这反过来又通过 &lt;p:ajax&gt;&lt;p:dataTable&gt; 中更新 &lt;p:panel id="panel"&gt;。有时这是必要的),给定 &lt;p:inputText&gt; 在 @ 987654333@ 导致验证,其边框变为红色,表示违反了应该发生的相关验证。

如果&lt;p:remoteCommand&gt; 被删除并且给定的&lt;p:commandButton&gt; 如下更改,

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

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

并且update 属性从update="panel" 更改为update="panel dataTable" 然后,当&lt;p:dataTable&gt; 中的一行被更新时,&lt;p:inputText&gt; 不会导致验证。

&lt;p:dataTable&gt; 中的一行使用&lt;p:ajax&gt; 更新时,如何防止&lt;p:inputText&gt; 执行验证,而&lt;p:panel&gt; 又持有有问题的&lt;p:inputText&gt;

&lt;p:remoteCommand&gt; 本身在这种情况下,不能省略。只有在没有违反验证时才需要更新&lt;p:dataTable&gt;。否则,即使存在验证错误,也会不必要地执行昂贵的业务服务。


关联的 JSF 托管 bean(尽管完全没有必要)。

@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 primefaces jsf-2.2 remotecommand


    【解决方案1】:

    执行此操作后,如果给定 &lt;p:dataTable&gt; 保存的行被更新(这反过来又通过 &lt;p:ajax&gt; 内部 &lt;p:ajax&gt; 更新 &lt;p:panel id="panel"&gt;。有时是必要的),给定的 @987654326 @ in &lt;p:panel id="panel"&gt; 导致验证,其边框变为红色,表示违反了应该发生的相关验证。

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

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

    您需要将其显式设置为@this

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

    【讨论】:

    • 作为 usaul,不仅仅是一个答案,而是完整的技术解释。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2012-09-13
    • 2020-03-28
    • 2019-03-03
    • 1970-01-01
    • 2012-10-06
    • 2014-08-11
    相关资源
    最近更新 更多