我正在使用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也是如此;模型也被正确分配。
答案 0 :(得分:1)
单击按钮时出现错误 ([AjaxRequestHandler @ 1701777932 responseObject [org.apache.wicket.ajax.AjaxRequestHandler$1@3e1])但没有进一步 有关错误的信息
=&GT;您应该在开发模式下运行Wicket以获得更详细的跟踪。
您可以在表单中添加一个名为“
”的字段range.start
range.stop
并使用Object MyRange作为属性模型,而不是为每个字段创建一个新的。 实际上没有必要进行额外的循环。如果为每个属性创建新的PropertyModel,我不认为Wicket会将信息写回MyRange对象。
塞巴斯蒂安