事件中的异步调用确认对话框



我想从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的响应撤销它们

最新更新