【问题标题】:Wicket: form submit with reusable components and AjaxButtonWicket:使用可重用组件和 AjaxButton 提交表单
【发布时间】:2012-09-28 16:54:32
【问题描述】:

我正在使用 wicket 版本 6。

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

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

不管怎样,

  • 当点击链接时,我的新对象被创建为具有正确的值除了那些用日期选择器选择的新日期

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

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

AjaxButton 被创建,onSubmit 被覆盖,只调用另一个方法和 target.add(form); 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;模型也被正确分配。

【问题讨论】:

    标签: ajax wicket


    【解决方案1】:

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

    => 您应该在 DEVELOPMENT 模式下运行 Wicket 以获得更详细的跟踪。

    您可以简单地在表单中添加一个名为:

    范围.开始

    范围.停止

    并使用 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号线

    塞巴斯蒂安

    【讨论】:

    • 感谢您的回复。我在 DEV 模式下运行检票口。我想构建一个可以处理时间范围的可重用组件,因此我将作为模型传递的 bean (MyRange) 引用到新的 FormComponent。但无论如何,我试图在同一个班级做所有事情,但我不认为这种方式应该是最终的解决方案
    • 那么你有更多的踪迹,而不是这一行。 Wicket 通常具有出色的跟踪和错误消息。
    • 不,没有进一步的输出(当我将其添加到反馈面板时,无论是在控制台中还是在网页上)。我之前也在 DEV 模式下运行
    • 我添加了登录到“wicket ajax 调试窗口”的调试信息
    • 但所选日期未在模型中更新 =>您在说什么模型。您实际上有 3 个模型。只要您不将此模型分配给字段,MyRange 就永远不会更新。我也想念您将“dpFrom”添加到实际的 FormComponent 中。您在构造函数中初始化它,但现在添加它。仅添加父级。但也许这只是基于代码 sn-ps 很难理解。
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多