3

我对部分处理有疑问。(我使用 primefaces 3.4.1。)我有一个 dataGrid 列表服务,并且 dataGrid 的每一行都有一个命令按钮“删除服务”,用于删除服务。我从支持 bean 的服务列表中删除指定的服务,并在单击“删除服务”按钮时更新数据网格。

另外,我在表单中有两个按钮;第一个按钮,“添加服务”,用于添加新服务;我在支持 bean 中的服务列表中添加了一个新对象,并在单击“添加服务”时更新数据网格。第二个“保存”按钮用于保存所有服务。单击“保存按钮”时,将服务列表插入数据库。

顺便说一句,我需要表单验证,因为我的服务对象中有必填字段。因此,应在单击“添加服务”和“保存”时验证表单。但是,单击“删除服务”按钮时不应验证表单。如果我为“删除服务”按钮使用 'process="@form"',一切正常。我可以从支持 bean 的服务列表中删除指定的服务,并且数据网格已正确更新。但正如您所知,由于所有表单都已处理,因此所有输入组件都已验证。如果我使用 'process="@this"' 或 'immediate="true"' 作为“删除服务”按钮,我无法到达最后一个条目。我的意思是,我无法到达最后一个服务。我想当我点击“删除服务”按钮时它还没有发布。所以我该怎么做?对这种情况有什么建议吗?提前致谢...

我的代码如下;

<h:form id="formServicesTab">
        <h:panelGrid id="pnlSvcTab" columns="1" styleClass="valignTop" width="100%">
            <p:dataGrid id="dgServices" var="service"
                value="#{subMerchantOperations.subMerchantServices}"
                columns="1" width="100%" styleClass="valignTop"
                emptyMessage="#{messagebundle.submerc_grdlabel_no_service}" transient="true"
                rowIndexVar="index" >

                <p:toolbar>
                    <p:toolbarGroup align="left">
                        <p:commandButton id="btnRemoveSvc" onclick="loading.show();"
                            oncomplete="loading.hide();"
                            value="#{messagebundle.submerc_btn_delete_service}"                         
                            actionListener="#{subMerchantOperations.removeService}"                     
                            process="@form" update="@form">

                            <f:setPropertyActionListener target="#{subMerchantOperations.serviceRowIndex}" value="#{index}" />
                        </p:commandButton>                      
                    </p:toolbarGroup>
                </p:toolbar>

                <h:panelGrid columns="3" styleClass="valignTop" width="100%" bgcolor="F0F0F0">
                    <p:panel style="background:#F0F0F0;">
                        <h:panelGrid id="pnlDgSvc" columns="1" width="100%" style="height:100%">
                            <h:outputText value="#{messagebundle.submerc_label_svc_shortName}" />
                            <h:panelGrid columns="2">
                                <p:inputText id="txtSvcName" value="#{service.serviceName}"
                                    required="true" transient="true"
                                    requiredMessage="#{messagebundle.submerc_validation_msg_required}"
                                    converter="UpperCaseConverter" />
                                <p:message for="txtSvcName" display="text" />
                            </h:panelGrid>

                            <h:outputText value="#{messagebundle.submerc_label_svc_website}" />
                            <p:inputText value="#{service.serviceUrl}" transient="true"/>                           
                        </h:panelGrid>
                    </p:panel>

                    <p:panel style="background:#F0F0F0;">
                        <h:panelGrid columns="1" width="100%">
                            ..........
                        </h:panelGrid>
                    </p:panel>

                    <p:panel style="background:#F0F0F0;">
                        <h:panelGrid id="pgSvcFiles" columns="1" width="100%">
                            ...........      
                        </h:panelGrid>
                    </p:panel>
                </h:panelGrid>
            </p:dataGrid>
        </h:panelGrid>
        <p:toolbar style="background:white">
            <p:toolbarGroup align="left">               
                <p:commandButton id="btnAddNewSvc"                  
                    value="#{messagebundle.submerc_btn_addSvc}"                  
                    actionListener="#{subMerchantOperations.addNewService}"
                    process="@form" update="@form" />

                <p:commandButton id="btnSaveSubM"                   
                    value="#{messagebundle.submerc_btn_sendApproval}"                   
                    action="#{subMerchantOperations.saveServices}" 
                    process="@form" update="@form" />
            </p:toolbarGroup>
        </p:toolbar>
    </h:form>

@ManagedBean
@ViewScoped
public class SubMerchantOperations implements Serializable {
    private static final long serialVersionUID = 8556103952857187080L;  

    private List<Service> subMerchantServices = new ArrayList<Service>();
    private int serviceRowIndex;    

    // add new empty service to the service list
    public void addNewService() {
        try {
            Service svc = new Service();
            svc.setStartDate(new Date());
            getSubMerchantServices().add(svc);                      
        }
        catch(Exception ex) {
            if (logger.isEnabledFor(Level.ERROR)) {
                ...
            }           
        }       
    }

    // Remove the specified service using index parameter got from the datagrid
    public void removeService() {
        try {
            getSubMerchantServices().remove(serviceRowIndex);   
        }
        catch(Exception ex) {
            ... 
        }                               
    }

    // DB Operations
    public String saveSubMerchant() {       
        ...
    }

    public List<Service> getSubMerchantServices() {
        return subMerchantServices;
    }

    public void setSubMerchantServices(List<Service> subMerchantServices) {
        this.subMerchantServices = subMerchantServices;
    }
    public int getServiceRowIndex() {
        return serviceRowIndex;
    }

    public void setServiceRowIndex(int serviceRowIndex) {
        this.serviceRowIndex = serviceRowIndex;
    }
}
4

1 回答 1

0

我不知道该transient属性在您的<p:dataGrid>. 我已经查看了 Primefaces PDF 文档的最新发布版本,但它没有被列为有效属性。

如果您发现基于 Facelet 的组件验证导致您的空表单在提交其中一个按钮时触发验证错误,您可以考虑在支持 bean 中创建一个由您的提交方法调用的方法,并验证豆子上的元素。这是 Primefaces 的一种流行方法,因为与Seam我们不同的是,它没有提供表单级验证。

但是,请检查您对 immediate=true 的理解

或者,您可以考虑使用JSR303注释来注释 POJO 的属性。

由于您使用的是集合,因此请确保您的 Service POJO覆盖equalshashcode排除您的集合没有发生一些棘手的事情并导致您的问题。

于 2012-11-22T17:47:01.840 回答