1

我正在使用 wicket 版本 6。

我有一个表格。作为表单的内容,我有一个FormComponentPanel,其中包含两个DateTimeFieldorg.apache.wicket.extensions.yui.calendar)。

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

无论如何,

  • 单击链接时,我的新对象将使用正确的值创建,但使用日期选择器选择的新日期除外

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

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

只需调用另一个方法和target.add(form)即可创建 AjaxButton 并覆盖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

编辑2

这是 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

编辑3

正如我在评论中所写:

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

4

1 回答 1

1

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

=> 您应该在开发模式下运行 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行

塞巴斯蒂安

于 2012-10-08T13:03:59.463 回答