我的Wicket面板上有一个DropDownChoice
元素。我使用前置条件来检查用户是否真的想要更改元素的值。如果对确认回答“否”,则不会调用更新,但dropField
的状态仍会更改,并且所选项目在ui中的元素上为值。
当前提条件失败时,我想恢复到旧状态(可能是从模型中获得)。 OnUpdate立即提交值,因此取消旧值后可见错误,因为它不再反映变量的数据库状态。
我应该在哪里放置我的确认对话框以便我可以取消/无应答还原ui元素的状态?或者以某种方式使用onPrecondition
监听器是否可能?
dropField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
AjaxCallListener listener = new AjaxCallListener();
listener.onPrecondition("return confirm('" + "foo" + "');");
attributes.getAjaxCallListeners().add(listener);
}
protected void onUpdate(AjaxRequestTarget target) {
..
}
}
修改
我目前的解决方案是使用抽象onAccept()方法显示一个模态以询问确认,然后在onUpdate()内部调用它并实现逻辑保存或在onCancel()中恢复。
protected void onUpdate(AjaxRequestTarget target) {
ConfirmModal modal = new ConfirmModal() {
@Override
protected void onAccept() {
..save..
}
@Override
protected void onCancel() {
..revert..
}
}
target.add(modal);
}
如您所见,我结束onUpdate()方法将新面板添加到目标,而不是更改任何内容。
我的解决方案是给模态作为参数赋予新值,在onAccept()
我可以使用该值。此外,我保存到dropField
旧值的同一文件中,因为在此过程中也会忘记它。
还要在更新后设置dropField
我需要访问目标,如
AjaxRequestTarget target = RequestCycle.get().find(AjaxRequestTarget.class);
如你所见,这是一种非常黑客的方式,仍在等待更好的见解。
EDIT2:
更完整的示例代码:
String oldValue;
protected void onUpdate(AjaxRequestTarget target) {
ConfirmModal modal = new ConfirmModal(theElement.getModeObject()) {
@Override
protected void onAccept() {
theElement.setModelObject(getValue());
oldValue = getValue();
}
@Override
protected void onCancel() {
theElement.setModelObject(oldValue);
}
}
target.add(modal);
}
答案 0 :(得分:0)
您的Java / Wicket解决方案过于繁琐。它会进行两次Ajax调用,而如果使用纯JavaScript则不会有任何调用。 问题是你在更改值后使用“em”触发的“更改”事件。请参阅评论中@svenmeier的链接以及解释和解决方案。您也可以尝试“点击”活动。
答案 1 :(得分:0)
我将旧值保存到变量并在取消确认消息后将其设置回来。
解决方案是纯java,hacksy,但有效。