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

Reverting dropDownChoice value if precondition is negative

我的 Wicket 面板上有一个 DropDownChoice 元素。我使用前提条件来检查用户是否真的想更改元素上的值。当您对确认回答否时,不会调用更新,但 dropField 的状态仍然发生变化,并且所选项目作为 ui 中元素的值。

我想在先决条件失败时恢复到旧状态(可能来自模型)。 OnUpdate 立即提交值,因此取消旧值后可见是错误的,因为它不再反映变量的数据库状态。

我应该将确认对话框放在哪里,以便我可以在取消/没有回答时恢复 ui 元素的状态?或者 onPreconditionlistener 是否有可能以某种方式?

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);

如您所见,这是 qui一种 hacksy 方式,仍在等待更好的见解。

编辑2:

更完整的示例代码:

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

您的 Java/Wicket 解决方案太啰嗦了。它进行两次 Ajax 调用,而如果您使用普通 JavaScript 则不会进行任何调用。 问题是您使用 'change' 在 值更改后 触发的事件。请参阅评论中@svenmeier 的 link 以及解释和解决方案。您也可以尝试使用 'click' 事件。

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

解决方案是纯粹的 java,虽然很笨拙,但是有效。