2012-04-27 5 views
2

Wickets AjaxFormComponentUpdatingBehaviourにこのような問題があります。フォームのいくつかのコンポーネントにこれを設定し、フォームにボタンを押した後に検証を追加すると、ajaxが異なる動作をした後、コンポーネントが検証をパスしなかったというエラーが表示されますモデルは更新されません。Wicketでフォームを送信した後のAjaxFormComponentUpdatingBehaviour問題

ここ

は、コード例です、changeableTxtからcheckBx、入力いくつかの値をチェックし、ボタンを提出し、空を押しsomeTextを残し、エラーが表示されますのであれば、そのフィールドsomeTextが必要です

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をクリックすると、changeableTxtフィールドは無効になりますが、nullの代わりに入力値の前に残ります。

答えて

1

まず、コードが正常に機能していると思われる理由を説明しましょう。 AjaxFormComponentUpdatingBehaviorはCheckBoxのモデルを更新しますが、このモデルのみを更新します。それはあなたがチェックボックスがchangeableTxtのTextFieldの値を変更することになっているのであれば、それは同様にそれをクリックしながら、それが持っている価値を提出しなければならないコードの行compoundModel.setChangeableTxt(null);

を削除する場合changeableTxtも空にとどまることを意味します。これは、checkBxchangeableTxtをフォームにラップし、AjaxFormSubmitBehaviorを使用してCheckBoxをクリックするとこのフォームを送信することで実現できます。

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> 

+0

I'veはすべて、トルステンが、それは、表示される、私はチェックボックスをクリックしなかったが、私がもう一度それをクリックすると、それはテキストフィールドを無効にし、ヌルにしません。 – Gytis

+0

私が家に帰るとすぐに確認します。私は完全なjavaとhtmlファイルを提供しますので、私たちはどこから離れているのか確認できます。 –

+0

これは通常の作業ですが、私のフォームはクリックで変更されませんが、この問題を解決する方法は他にあります。私は新しいアイテムを作成し、それらにいくつかの価値を設定するので、それは古いコンポーネントではなく、サブミット後に更新されませんが、新しい新しいものです。 – Gytis

関連する問題