如果前提条件为负,则还原dropDownChoice值

时间:2015-10-21 08:26:53

标签: java ajax wicket

我的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);
}

2 个答案:

答案 0 :(得分:0)

您的Java / Wicket解决方案过于繁琐。它会进行两次Ajax调用,而如果使用纯JavaScript则不会有任何调用。 问题是你在更改值后使用“em”触发的“更改”事件。请参阅评论中@svenmeier的链接以及解释和解决方案。您也可以尝试“点击”活动。

答案 1 :(得分:0)

我将旧值保存到变量并在取消确认消息后将其设置回来。

解决方案是纯java,hacksy,但有效。