Как я могу передать строку или список имен функций для обработки в качестве обратных вызовов в Javascript - PullRequest
0 голосов
/ 13 февраля 2012

Я немного погуглил, но не совсем нашел то, что мне нужно.

В попытке уменьшить количество строк JAvascript, которые требуются моим приложениям, я пытаюсь использовать как можно больше функций многократного использования.

Проблема, конечно, состоит в том, чтобы сделать эти функции максимально гибкими.

Итак, у меня есть форма, которая динамически расширяется с помощью функции клонирования с использованием jQuery.Чтобы это работало, необходимо выполнить несколько дополнительных функций, например, чтобы правильно инициализировать средства выбора даты для динамически создаваемых элементов.

Эти требования различаются в зависимости от того, какая форма клонируется.

Итак, я вызываю свою функцию клонирования следующим образом:

$('.button').click(function (){
    var thisID = $(this).attr('id').replace('add', '');
    cloneDetails(thisID, initialiseDates);
});

Функция cloneDetails выглядит следующим образом:

function cloneDetails(cur_num, callBackFunctions) {

  /// do loads of stuff ///

 callBackFunctions();

});

В этом случае функция клонирования будет запущенаи делать то, что ему нужно, тогда он будет запускать второй вызов функции initialiseDates

Что я хочу сделать, хотя это указать несколько имен функций для запуска после функции клонирования с помощью вызова, такого как

cloneDetails(thisID, 'initialiseDates, doSomethingElse, doAnotherThing');

Итак, указание списка функций, запускаемых после запуска функции cloneDetails.

Не думаю, что я правильно настраиваю метод callBack и незнаю, как я должен быть.

Помощь очень ценится.

РЕДАКТИРОВАТЬ: я не хочу объединить все эти функции в одну функцию, весь смысл в том, что этивсе функции должны использоваться независимо и / или вместе.

Ответы [ 2 ]

1 голос
/ 05 февраля 2013

Другой вариант (если вы используете jQuery> 1.7): вы можете использовать функцию jQuery.Callbacks .

cloneDetails(thisID, $.Callbacks()
    .add(initialiseDates, doSomethingElse, doAnotherThing));

function cloneDetails(cur_num, callBackFunctions) {

  /// do loads of stuff ///

  callBackFunctions.fire();

});
1 голос
/ 13 февраля 2012

Я могу придумать несколько подходов:

  1. Вы можете разбить строку и использовать eval(name+'()') в каждом имени в списке. Обратите внимание, что eval() может быть злом, в плане безопасности.

  2. Вместо строки, почему бы не передать функции в виде массива? Просто переберите arguments[1..n] (arguments - это автоматическая переменная, которая содержит все аргументы функции).

  3. Использовать анонимную функцию:

    cloneDetails(thisID, function(){
        initialiseDates();
        doSomethingElse();
        doAnotherThing();
    });
    

Мне нравится последний подход, потому что:

  1. Это самый гибкий
  2. Читаемые
  3. Добавляет только несколько байтов кода там, где они вам нужны
  4. Самый производительный
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...