передать функцию как обратный вызов функции - PullRequest
1 голос
/ 20 июля 2011

У меня есть этот код:

$('.b-icon.b-icon_del').click(function(e) {
showConfirmDialog('Are you sure you want to delete this document?',deleteDocument(window.lastSelectedRowId), 'Delete document');                    
}); 

function showConfirmDialog(content, callback, pTitle, obj){
    return showDialogEx(content, callback, pTitle, obj, "Yes", "No");
}

function showDialogEx(content, callback, pTitle, obj, okButtonLabel, cancelButtonLabel){
    var str = "#_showMessageDialog";
    var showMessageDialog = $(str);
    if(showMessageDialog.length == 0){
        $('body').append('<div id="_showMessageDialog"></div>');
        showMessageDialog = $(str);
    }
    showMessageDialog.val("");
    showMessageDialog.append('<p id="_showMessageDialogContent">'.concat(content, '</p>'));

    var my_buttons = {};
    my_buttons[cancelButtonLabel] = function(){
        $(this).dialog("close");
        $(this).html("");
        $(this).dialog("destroy");
    };
    my_buttons[okButtonLabel] = function(){
        callback();
        $(this).html("");
        $(this).dialog("close");
        if(obj){
            obj.focus();
        }
        $(this).dialog("destroy");
    };

    showMessageDialog.dialog({
        modal : true,
        resizable : true,
        title : pTitle,
        minWidth : 250,
        width : 450,
        buttons : my_buttons
    });

}

И затем я нажимаю на кнопку с классами .b-icon.b-icon_del, кажется, что в данный момент выполняется deleteDocument(window.lastSelectedRowId) и showConfirmDialog('Are you sure you want to delete this document?',deleteDocument(window.lastSelectedRowId), 'Delete document'); .Я просто хочу, чтобы эта функция обратного вызова (deleteDocument(window.lastSelectedRowId)) была вызвана после того, как пользователь нажал кнопку «ОК».Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 июля 2011
$('.b-icon.b-icon_del').click(function(e) {
showConfirmDialog('Are you sure you want to delete this document?',deleteDocument, [window.lastSelectedRowId], 'Delete document');                    
}); 

function showConfirmDialog(content, callback, callbackArguments, pTitle, obj){
    return showDialogEx(content, callbackArguments,  pTitle, obj, "Yes", "No");
}

и в:

function showDialogEx(content, callback, callbackArguments, pTitle, obj, okButtonLabel, cancelButtonLabel)

строки:

my_buttons[okButtonLabel] = function(){
    callback();

Должно быть:

my_buttons[okButtonLabel] = function(){
    callback.apply(this, callbackArguments);

Важно отметить, что callbackArgumentsсписок ["value'], даже если он имеет только одно значение.

2 голосов
/ 20 июля 2011

Вы выполняете функцию deleteDocument(window.lastSelectedRowId), когда передаете ее в качестве второго аргумента showConfirmDialog.

Вы должны просто передать его вместе с аргументом window.lastSelectedRowId вместе с showConfirmDialog, не выполняя его.

$('.b-icon.b-icon_del').click(function(e) {
showConfirmDialog('Are you sure you want to delete this document?',deleteDocument, window.lastSelectedRowId, 'Delete document');                    
}); 

function showConfirmDialog(content, callback, rowId, pTitle, obj){
    return showDialogEx(content, callback, rowId, pTitle, obj, "Yes", "No");
}

function showDialogEx(content, callback, rowId, pTitle, obj, okButtonLabel, cancelButtonLabel){
    var str = "#_showMessageDialog";
    var showMessageDialog = $(str);
    if(showMessageDialog.length == 0){
        $('body').append('<div id="_showMessageDialog"></div>');
        showMessageDialog = $(str);
    }
    showMessageDialog.val("");
    showMessageDialog.append('<p id="_showMessageDialogContent">'.concat(content, '</p>'));

    var my_buttons = {};
    my_buttons[cancelButtonLabel] = function(){
        $(this).dialog("close");
        $(this).html("");
        $(this).dialog("destroy");
    };
    my_buttons[okButtonLabel] = function(){
        callback(rowId);
        $(this).html("");
        $(this).dialog("close");
        if(obj){
            obj.focus();
        }
        $(this).dialog("destroy");
    };

    showMessageDialog.dialog({
        modal : true,
        resizable : true,
        title : pTitle,
        minWidth : 250,
        width : 450,
        buttons : my_buttons
    });

}
1 голос
/ 20 июля 2011

В качестве альтернативы, оберните deleteDocument(window.lastSelectedRowId) в функцию, чтобы предотвратить ее преждевременную оценку при вызове $('.b-icon.b-icon_del').click().

т.е.

$('.b-icon.b-icon_del').click(function(e) {
showConfirmDialog('Are you sure you want to delete this document?', function() { return deleteDocument(window.lastSelectedRowId); }                  
}); 
...