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

时间:2014-08-17 13:57:53

标签: javascript jquery asynchronous

我想从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之前返回。我该怎么办?我也尝试了另一个承诺..但它仍然回到了同样的事情。有人看到了解决方法吗?

1 个答案:

答案 0 :(得分:0)

您必须知道onBeforeEventChanged中的return语句将始终返回false,因为moveConfirmation().then(...)是异步的。

您可能必须像处理一样取消onBeforeEventChanged事件,而不是简单地在saveEvent = move;处理程序中设置moveConfirmation,您将不得不重新触发尝试以编程方式操作以防用户想要继续(可能使用updateEvent)。

另请注意,您需要一种机制来避免重新触发过程再次调用对话框(例如,在调用onBeforeEventChanged时触发updateEvent)。

编辑:请注意,如果在UI上看起来更好,也可以接受事件更改,也可以执行相反操作,但根据moveConfirmation的响应,根据需要撤消它们。