2012-04-27 103 views
2

我有這樣的問題Wickets AjaxFormComponentUpdatingBehaviour。當你將它設置爲表單上的某些組件併爲其添加驗證時,在按下「提交表單」按鈕之後,並且可以說,出現錯誤,組件未通過驗證,此後ajax表現出不同,不更新模型。AjaxFormComponentUpdatingBehaviour問題表單在Wicket提交

下面是代碼示例:

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,離開someText空並按提交按鈕,就會出現錯誤,則需要該字段someText。之後,如果我們點擊checkBx,它會使changeableTxt字段禁用,但它會在輸入值之前離開,而不是空。

回答

1

那麼讓我們從解釋爲什麼你會認爲你的代碼正在工作開始吧: AjaxFormComponentUpdatingBehavior會更新CheckBox的模型,但只會更新這個模型。這意味着,即使changeableTxt會留下空的,如果你刪除代碼行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所做的一切,就像你說的,和Thorsten,但它的出現,是,當我點擊複選框,它使文本框啓用,但當我再次單擊它時,它不會使textfield禁用並且爲空 – Gytis 2012-04-30 08:21:41

+0

我一回到家就會檢查。我將提供完整的java&html文件,以便我們可以看到我們的偏離路徑 – 2012-04-30 12:37:55

+0

好吧,這不是正常工作,我的表單不會在點擊時改變,但我找到了解決此問題的其他方法。我創建了新項目,併爲它們設置了一些值,因此它不是舊的組件,它們在提交後不更新,而是新的新組件。 – Gytis 2012-05-11 05:58:45