如果前提条件为负,则还原 dropDownChoice 值
Reverting dropDownChoice value if precondition is negative
我的 Wicket 面板上有一个 DropDownChoice
元素。我使用前提条件来检查用户是否真的想更改元素上的值。当您对确认回答否时,不会调用更新,但 dropField
的状态仍然发生变化,并且所选项目作为 ui 中元素的值。
我想在先决条件失败时恢复到旧状态(可能来自模型)。 OnUpdate 立即提交值,因此取消旧值后可见是错误的,因为它不再反映变量的数据库状态。
我应该将确认对话框放在哪里,以便我可以在取消/没有回答时恢复 ui 元素的状态?或者 onPrecondition
listener 是否有可能以某种方式?
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,虽然很笨拙,但是有效。
我的 Wicket 面板上有一个 DropDownChoice
元素。我使用前提条件来检查用户是否真的想更改元素上的值。当您对确认回答否时,不会调用更新,但 dropField
的状态仍然发生变化,并且所选项目作为 ui 中元素的值。
我想在先决条件失败时恢复到旧状态(可能来自模型)。 OnUpdate 立即提交值,因此取消旧值后可见是错误的,因为它不再反映变量的数据库状态。
我应该将确认对话框放在哪里,以便我可以在取消/没有回答时恢复 ui 元素的状态?或者 onPrecondition
listener 是否有可能以某种方式?
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,虽然很笨拙,但是有效。