部分的な処理に問題があります。(私は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;
}
}