2

私はそのような問題を抱えていWickets AjaxFormComponentUpdatingBehaviourます。これをフォーム上のいくつかのコンポーネントに設定し、それらに検証を追加すると、[フォームの送信]ボタンを押した後、たとえば、コンポーネントが検証に合格しなかったというエラーが発生した後、ajax動作が異なります。モデルを更新しません。

コード例は次のとおりです。

TextField someText = new TextField("someTextId");
someText.setRequired(true); //added validation on requireness
CheckBox checkBx = new CheckBox("checkBxId");
TextField changeableTxt = new TextField("changeableTxtId");
changeableTxt.setEnabled(false);

checkBx.add(new AjaxFormComponentUpdatingBehaviour("onclick"){
protected void onUpdate(AjaxRequestTarget target) {
    if(compoundModel.isCheckBx()){
         changeableTxt.setEnabled(true);
         target.addComponent(changeableTxt);
    }else{
         compoundModel.setChangeableTxt(null);
         changeableTxt.setEnabled(false);
         target.addComponent(changeableTxt);
    }
  }
});
Form form = new Form("form", compoundModel);
form.add(someText, checkBx, changeableTxt);
add(form);

したがって、をチェックしcheckBx、値を入力しchangeableTxtsomeText空のままにして送信ボタンを押すと、エラーが表示されます。そのフィールドsomeTextは必須です。その後、をクリックcheckBxするとchangeableTxtフィールドが無効になりますが、入力値の前にnullではなくそのままになります。

4

1 に答える 1

1

コードが機能していると思われる理由を説明することから始めましょう。AjaxFormComponentUpdatingBehavior は CheckBox のモデルを更新しますが、このモデルのみを更新します。つまりchangeableTxt、コード行を削除しても は空のままです。compoundModel.setChangeableTxt(null);

したがって、チェックボックスがchangeableTxtTextField の値を変更することになっている場合は、クリックしている間もその値を送信する必要があります。これを実現するには、フォームをラップして、AjaxFormSubmitBehavior を使用して CheckBox をクリックしたときにこのフォームを送信しますcheckBxchangeableTxt

public class TestingPanel extends Panel {
    public TestingPanel(String id) {
    super(id);

    final CompoundModel compoundModel = new CompoundModel();

    final Form<CompoundModel> form = new Form<CompoundModel>("form",
            new CompoundPropertyModel<CompoundModel>(compoundModel)) {
        @Override
        protected void onValidate() {
            System.out.println("validate: "
                    + compoundModel.getChangeableTxt());
            System.out.println("validate: "
                    + getModel().getObject().getChangeableTxt());

            super.onValidate();
        }
    };
    form.setOutputMarkupId(true);
    add(form);

    TextField someText = new TextField("someText");
    someText.setRequired(true); // added validation on requireness
    final CheckBox checkBx = new CheckBox("checkBx");
    final TextField changeableTxt = new TextField("changeableTxt");
    changeableTxt.setOutputMarkupId(true);
    changeableTxt.setEnabled(false);

    Form checkBoxForm = new Form("checkBoxForm");
    form.add(checkBoxForm);

    AjaxFormSubmitBehavior submitBehavior = new AjaxFormSubmitBehavior(
            checkBoxForm, "onclick") {

        @Override
        protected void onSubmit(AjaxRequestTarget target) {
            if (checkBx.getModelObject() == true) {
                changeableTxt.setEnabled(true);
                target.add(changeableTxt);
            } else {
                compoundModel.setChangeableTxt(null);
                changeableTxt.setEnabled(false);
                target.add(changeableTxt);
            }

        }

        @Override
        protected void onError(AjaxRequestTarget target) {

        }
    };
    checkBx.add(submitBehavior);
    checkBoxForm.add(checkBx, changeableTxt);

    AjaxFormComponentUpdatingBehavior updateBehavior = new AjaxFormComponentUpdatingBehavior(
            "onclick") {
        protected void onUpdate(AjaxRequestTarget target) {
            if (compoundModel.isCheckBx()) {
                changeableTxt.setEnabled(true);
                target.addComponent(changeableTxt);
            } else {
                // compoundModel.setChangeableTxt("");
                changeableTxt.setEnabled(false);
                target.add(changeableTxt);
            }
        }
    };

    form.add(someText);

    FeedbackPanel feedbackPanel = new FeedbackPanel("feedbackPanel");
    form.add(feedbackPanel);

    AjaxSubmitLink submit = new AjaxSubmitLink("submit", form) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            target.add(form);
        }

        @Override
        protected void onError(AjaxRequestTarget target, Form<?> form) {
            target.add(form);

        }
    };
    add(submit);

}

class CompoundModel implements Serializable {

    private boolean checkBx = false;

    private String someText = null;

    private String changeableTxt = null;

    public boolean isCheckBx() {
        return checkBx;
    }

    public void setCheckBx(boolean checkBx) {
        this.checkBx = checkBx;
    }

    public String getSomeText() {
        return someText;
    }

    public void setSomeText(String someText) {
        this.someText = someText;
    }

    public String getChangeableTxt() {
        return changeableTxt;
    }

    public void setChangeableTxt(String changeableTxt) {
        this.changeableTxt = changeableTxt;
    }

}
}

次のhtmlで:

<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
    <form wicket:id="form">
        <div wicket:id="feedbackPanel" />
        <input type="text" wicket:id="someText"  /><br />
        <form wicket:id="checkBoxForm">
            <input type="checkbox" wicket:id="checkBx" /><br />
            <input type="text" wicket:id="changeableTxt" /><br />
        </form>
    </form>
    <a wicket:id="submit">submit</a>
</wicket:panel>

于 2012-04-27T20:46:46.967 に答える