3

JSFページで、最初の請求名フィールドに名前を入力するときに問題が発生しました。[請求先住所をコピーする]チェックボックスをクリックすると、これにより、配送先住所パネルのレンダリングが停止し、ajaxを介して非表示になります。最初のフィールドに入力した値は、以前の状態にリセットされます。

JSFページ

<h:form>
    <p:inputText value="#{addressBean.billingAddress.firstName}" required="true"/ >

    <p:selectBooleanCheckbox value="#{addressBean.copyBillingAddress}" id="duplicateBillingDetails">
        <f:ajax render="@form" />
    </p:selectBooleanCheckbox>

    <h:panelGrid rendered="#{not addressBean.copyBillingAddress}" columns="3">
        <p:inputText value="#{addressBean.deliveryAddress.firstName}"/>
    </h:panelGrid>

    <p:commandButton value="Checkout" action="#{addressBean.saveAddress}"/>
</h:form>

バッキングビーン

@Component
@Scope("view")
public class AddressBean implements Serializable {
    @Inject
    private CurrentUserBean currentUserBean;
    @Inject
    private UserService userService;
    private Address deliveryAddress = new Address();
    private Address billingAddress = new Address();
    private boolean copyBillingAddress;


    public AddressBean() {

    }

    public boolean isCopyBillingAddress() {
        return copyBillingAddress;
    }

    public void setCopyBillingAddress(boolean copyBillingAddress) {
        this.copyBillingAddress = copyBillingAddress;
    }


    public String saveAddress() {
        if (copyBillingAddress) {
            deliveryAddress = new Address(billingAddress);
        }

        User user = currentUserBean.getUser();
        if (!billingAddress.isSame(user.getBillingAddress())) {
            user.setBillingAddress(billingAddress);
        }
        if (!deliveryAddress.isSame(user.getDeliveryAddress())) {
            user.setDeliveryAddress(deliveryAddress);
        }
        currentUserBean.setUser(userService.save(user));
        return "/checkout.xhtml";
    }

    public CurrentUserBean getCurrentUserBean() {
        return currentUserBean;
    }


    public void setCurrentUserBean(CurrentUserBean currentUserBean) {
        this.currentUserBean = currentUserBean;
    }

    public Address getDeliveryAddress() {
        return deliveryAddress;
    }

    public void setDeliveryAddress(Address deliveryAddress) {
        this.deliveryAddress = deliveryAddress;
    }

    public Address getBillingAddress() {
        return billingAddress;
    }

    public void setBillingAddress(Address billingAddress) {
        this.billingAddress = billingAddress;
    }




}
4

1 に答える 1

4

デフォルトでは、の<f:ajax>ように現在のコンポーネントのみを処理しますexecute="@this"。したがって、他のすべての入力コンポーネントの送信された値は処理されないため、モデルに更新されません。ただし、render="@form"フォームのHTML出力全体を、他のすべての入力コンポーネントの現在の(更新されていない!)モデル値で強制的に更新する必要があります。

他のすべての入力コンポーネントを不必要に変換/検証/更新しないことが目的であると仮定すると、render属性をより具体的にする方がよいでしょう。フォーム全体ではなく、実際に更新する必要があるコンテンツのみを更新します。

<p:selectBooleanCheckbox value="#{addressBean.copyBillingAddress}" id="duplicateBillingDetails">
    <f:ajax render="copyBillingAddress" />
</p:selectBooleanCheckbox>

<h:panelGroup id="copyBillingAddress">
    <h:panelGrid rendered="#{not addressBean.copyBillingAddress}" columns="3">
        <p:inputText value="#{addressBean.deliveryAddress.firstName}"/>
    </h:panelGrid>
</h:panelGroup>

または、本当に必要な場合は、他のすべての入力コンポーネントも処理するように指示するためにrender="@form"、を追加する必要があります。execute="@form"<f:ajax>

<f:ajax execute="@form" render="@form" />

これにより、これらの入力コンポーネントで不必要に変換/検証がトリガーされる可能性があることに注意してください。

参照:

于 2013-01-02T17:59:21.013 に答える