Wicket:使用可重用组件和AjaxButton提交表单

时间:2012-10-08 12:27:04

标签: ajax wicket

我正在使用wicket版本6。

我有一张表格。作为表单的内容,我有一个 FormComponentPanel ,它包含两个 DateTimeField org.apache.wicket.extensions.yui.calendar ) 。

在包含表单的类中,我有一个AjaxButton和一个AjaxLink,两者都做同样的事情:读取模型,创建一个新对象并将其发送到某个服务器进行处理。

无论如何,

  • 点击链接时,我的新对象是使用正确的值创建的,除了使用datepicker选择的新日期

  • 单击Button时出现错误( [AjaxRequestHandler @ 1701777932 responseObject [org.apache.wicket.ajax.AjaxRequestHandler$1@3e1] )但没有关于错误的进一步信息< / p>

好吧,我解决了第一个问题(链接)尝试向其添加ajax更新行为,如建议的here,但所选日期未在模型中更新

创建了AjaxButton,只需调用另一个方法 target.add(form)就会覆盖 onSubmit ; setOutputMarkupId 也设置为 true ,但似乎仍然缺少某些内容

为了让它发挥作用,我只需要解决其中一个问题,但如果有人能解决这两个问题,那就太好了。提前谢谢。

修改

public MyPanelIncludingForm() {
  // ...
  form.add(getRangePanel()); // creates a new TimeRangePanel and returns the instance
  form.add(getSubmitButton());
  // ...
}

private FormComponent<String> getSubmitButton() {
  FormComponent<String> submitBtn = new AjaxButton("submitBtn", form) {
  private static final long serialVersionUID = 3005L;

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
      System.out.println("submit QT ajax button");
      setResponsePage(HomePage.class);
      sendQuery();
      target.add(form);
    }

    @Override
    protected void onError(AjaxRequestTarget target, Form<?> form) {
      System.err.println("error occurred. " + target);
      target.add(feedback);
    }
  };
  submitBtn.setOutputMarkupId(true);
  return submitBtn;
}

// separate FormComponentModel for timeRange

public class TimeRangePanel extends FormComponentPanel<MyRange> {

MyRange range;
PropertyModel<Date> dpFromPM = new PropertyModel<Date>(this, "range.start");
PropertyModel<Date> dpToPM = new PropertyModel<Date>(this, "range.stop");
public RangePanel(String id, IModel<MyRange> model) {
  super(id, model);

dpFrom = new DateTimeField("dpFrom", dpFromPM) {
  private static final long serialVersionUID = 3006L;

  @Override
  protected DateTextField newDateTextField(String id, PropertyModel<Date> model) {

    DateTextField dtf = super.newDateTextField(id, model);

    AjaxFormComponentUpdatingBehavior a = new AjaxFormComponentUpdatingBehavior("onChange") {
      private static final long serialVersionUID = 3006L;
      @Override
      protected void onUpdate(AjaxRequestTarget target) {
        System.out.println("here u " + dpFrom.getModelObject().toString());
      }
    };
    dtf.add(a);
    return dtf;
  }
};

// second DateTimeField as dpFrom

} // end of constructor

@Override
protected void onBeforeRender() {
  range = getModelObject();
  super.onBeforeRender();
}

} // end of class

EDIT2

这是wicket ajax调试窗口正在打印的内容:

INFO: focus removed from 
INFO: focus set on submitBtn11
INFO: Received ajax response (299 characters)
INFO:
<div wicket:id="feedbackQuery" class="feedback" id="feedbackQuery1c"><wicket:panel>
  <ul wicket:id="feedbackul" class="feedbackPanel">
    <li wicket:id="messages" class="feedbackPanelERROR">
      <span wicket:id="message" class="feedbackPanelERROR"></span>
    </li>
  </ul>
</wicket:panel></div>
INFO: returned focused element: [object HTMLInputElement]
INFO: returned focused element: [object HTMLInputElement]
INFO: Response processed successfully.
INFO: refocus last focused component not needed/allowed
INFO: focus removed from submitBtn11

EDIT3

我在评论中写道:

我删除了可重用的组件( FormComponentPanel ),现在我没有收到AjaxButton的错误。无论如何,这很奇怪,我认为可重用的组件应该可以工作,即使使用Ajax也是如此;模型也被正确分配。

1 个答案:

答案 0 :(得分:1)

  

单击按钮时出现错误   ([AjaxRequestHandler @ 1701777932 responseObject   [org.apache.wicket.ajax.AjaxRequestHandler$1@3e1])但没有进一步   有关错误的信息

=&GT;您应该在开发模式下运行Wicket以获得更详细的跟踪。

您可以在表单中添加一个名为“

”的字段

range.start

range.stop

并使用Object MyRange作为属性模型,而不是为每个字段创建一个新的。 实际上没有必要进行额外的循环。如果为每个属性创建新的PropertyModel,我不认为Wicket会将信息写回MyRange对象。

例如:http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java?view=markup 第276行

和相应的HTML http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UsersPanel.html?view=markup 第82行

塞巴斯蒂安