2012-04-27 102 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