Генерация массива различных функций обратного вызова в Javascript - PullRequest
0 голосов
/ 29 июля 2011

Я пытаюсь сгенерировать массив функций обратного вызова для использования в диалоге пользовательского интерфейса jQuery

С учетом следующего кода:

for(var x in methods)
{

  buttons[x] = function() {

            var method = methods[x];

            var data = $('#dialog_'+model+' form').serialize();
            data += '&form='+model;
            $.post(
                    $('#dialog_'+model+' form').attr('action')+'method/'+method+'/',
                    data,
                    function(r) {
                            handleFormReturn(r);   
                    },
                    'json'
            );
  };

}

При вызове функция, очевидно, будет использовать последнее известное значение переменной x, а не то, которое мне нужно. Как я могу избежать этой проблемы, не прибегая к использованию eval ()?

Может быть, я все делаю неправильно, но насколько я знаю, невозможно передать параметр в обратный вызов.

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Вам необходимо создавать новую область видимости переменной во время каждого прохода в цикле for.Это можно сделать только путем вызова функции.

function createButton(x) {
    buttons[x] = function () {
        var method = methods[x];
        var data = $('#dialog_' + model + ' form').serialize();
        data += '&form=' + model;
        $.post(
        $('#dialog_' + model + ' form').attr('action') + 'method/' + method + '/', data, function (r) {
            handleFormReturn(r);
        }, 'json');
    };
}
for (var x in methods) {
    createButton(x);
}

Теперь значение x, на которое ссылается функция buttons[x], будет тем, которое было передано createButton.

0 голосов
/ 29 июля 2011

Вам необходимо создать замыкание для каждого элемента в массиве методов:

for(var x in methods) {

    buttons[x] = (function(x) {

        var method = methods[x];

        return function () {
            var data = $('#dialog_'+model+' form').serialize();
            data += '&form='+model;
            $.post(
                $('#dialog_'+model+' form').attr('action')+'method/'+method+'/',
                data,
                function(r) {
                        handleFormReturn(r);   
                },
                'json'
            );
        };
    })(x);
}
0 голосов
/ 29 июля 2011

Немедленная версия функции решения patrick dw :

for (var x in methods) {
    buttons[x] = (function (x) {
        return function () {
            /* ... x is local for this function ... */
        };
     })(x);
}
...