我想从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之前返回。我该怎么办?我也试过另一个承诺…但最终还是一样的。有人看到解决这个问题的方法吗?
您必须知道onBeforeEventChanged
中的返回语句将始终返回false,因为moveConfirmation().then(...)
是异步的。
您可能必须总是像您正在做的那样取消onBeforeEventChanged
事件,而不是简单地在moveConfirmation
处理程序中设置saveEvent = move;
,您必须以编程方式重新触发尝试的操作,以防用户想要继续(可能使用updateEvent
)。
还请注意,您需要一个适当的机制,以避免重新触发进程再次调用您的对话框(例如,如果在调用updateEvent
时触发onBeforeEventChanged
)。
编辑:请注意,如果它在UI上看起来更好,您也可以做相反的事情,始终接受事件更改,但如果需要按moveConfirmation
的响应撤销它们