我想从jQuery确认对话框返回一个布尔值,并将该值返回给事件(继续或停止事件的默认执行)。我知道异步调用,但我真的无法解决这个问题。这就是我现在所拥有的:
function moveConfirmation() {
var defer = $.Deferred();
$('#dialog-move-confirm').dialog({
resizable: false,
width: 400,
height: 200,
autoOpen: true,
modal: true,
buttons: {
'Move Separately': function() {
$(this).dialog('close');
defer.resolve(true);
},
'Move Together': function() {
$(this).dialog('close');
defer.resolve(false);
},
Cancel: function() {
$(this).dialog('close');
defer.resolve(false);
}
}
});
return defer.promise();
}
scheduler.attachEvent('onBeforeEventChanged', function(id, ev) {
// if move contemporaneous exams, alert user to choose if move together or separately
var state = scheduler.getState();
var saveEvent = false;
if (state.drag_mode === 'move') {
moveConfirmation().then(function(move) {
saveEvent = move;
});
}
return saveEvent;
}
正在发生的事情是saveEvent仍为false并在promise之前返回。我该怎么办?我也尝试了另一个承诺..但它仍然回到了同样的事情。有人看到了解决方法吗?
答案 0 :(得分:0)
您必须知道onBeforeEventChanged
中的return语句将始终返回false,因为moveConfirmation().then(...)
是异步的。
您可能必须像处理一样取消onBeforeEventChanged
事件,而不是简单地在saveEvent = move;
处理程序中设置moveConfirmation
,您将不得不重新触发尝试以编程方式操作以防用户想要继续(可能使用updateEvent
)。
另请注意,您需要一种机制来避免重新触发过程再次调用对话框(例如,在调用onBeforeEventChanged
时触发updateEvent
)。
编辑:请注意,如果在UI上看起来更好,也可以接受事件更改,也可以执行相反操作,但根据moveConfirmation
的响应,根据需要撤消它们。