3

部分的な処理に問題があります。(私はprimefaces 3.4.1を使用しています。)サービスをリストするdataGridがあり、dataGridの各行には、サービスを削除するためのコマンドボタン「サービスの削除」があります。バッキング Bean のサービス リストから指定されたサービスを削除し、[サービスの削除] ボタンがクリックされている間にデータグリッドを更新します。

また、フォームに 2 つのボタンがあります。最初のボタン「サービスを追加」は、新しいサービスを追加するために機能します。バッキング Bean のサービス リストに新しいオブジェクトを追加し、[サービスの追加] をクリックしている間にデータグリッドを更新します。2 番目の「保存」ボタンは、すべてのサービスを保存するために機能します。「保存ボタン」をクリックすると、サービスリストがデータベースに挿入されます。

ところで、サービス オブジェクトに必須フィールドがあるため、フォームの検証が必要です。そのため、「サービスの追加」と「保存」がクリックされている間、フォームを検証する必要があります。ただし、「サービスの削除」ボタンがクリックされている間、フォームは検証されるべきではありません。「サービスの削除」ボタンに「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 ベースのコンポーネントの検証が原因で、ボタンの 1 つの送信時に空のフォームで検証エラーが発生することがわかっている場合は、送信メソッドによって呼び出されるバッキング Bean にメソッドを作成し、その状態を検証することを検討してください。 Bean の要素。Seamこれは、フォームレベルの検証が提供されていないため、Primefaces で一般的なアプローチです。

ただし、immediate=true の理解を確認してください

または、POJO のプロパティにJSR303アノテーションを付けることを検討することもできます。

コレクションを使用しているため、サービス POJOがオーバーライドequalshashcodeれていることを確認し、コレクションで何かおかしなことが起こっていないことを確認して、問題を引き起こしていることを除外します。

于 2012-11-22T17:47:01.840 に答える