2015-03-21 1 views
1

Я использую mainSubmitHandler для нескольких страниц и желаю определить его как глобальную переменную, если это необходимо. mainSubmitHandler, однако, требует некоторой настройки, и я обрабатываю это, используя subSubmitHandler. Вместо того, чтобы иметь subSubmitHandler как еще одну глобальную переменную, как я могу передать ее как agrument для mainSubmitHandler?Функция пропуска для отправки обратного вызоваHandler

var mainSubmitHandler=function(form) { 
    //do a bunch of stuff 
    subSubmitHandler(form); 
}; 

var subSubmitHandler=function(form) { 
    //do some stuff 
}; 

// uses jQuery validation plugin 
var validator=$("#form1").validate({ 
    rules: {}, 
    messages: {}, 
    submitHandler: mainSubmitHandler 
}); 
+0

использование 'bind':' mainSubmitHandler.bind (нуль, функция) ' – Mouser

+0

@Mouser Просьба уточнить. – user1032531

ответ

3

Вы можете использовать bind здесь ,

bind обернут вокруг ссылки функцию, позволяющую передать масштаб и переменные для целевой функции:

function.bind (thisArg [, arg1 [arg2, [...]]])

Параметры:

  • thisArg: значение, которое передается в качестве этого параметра к целевой функции, когда связанный функция вызывается. Значение игнорируется, если связанная функция строится с использованием нового оператора.
  • arg1, arg2, ... Аргументы для добавления аргументов, предоставляемых связанной функции при вызове целевой функции.

Источник MDN

var mainSubmitHandler=function(form, callback) { 
    //do a bunch of stuff 
    if (typeof(callBack) != "undefined" && Object.prototype.toString.call(callBack) === "[object Function]") //sanity check. Check if callback is truly a function and exists. 
    { 
     callback(form); 
    } 
}; 

var subSubmitHandler=function(form) { 
    //do some stuff 
}; 

// uses jQuery validation plugin 
var validator=$("#form1").validate({ 
    rules: {}, 
    messages: {}, 
    submitHandler: mainSubmitHandler.bind(null, form, subSubmitHandler); //first argument is set to null. This passes the this argument of the targeted function. 
}); 
+0

А, это то, чего мне не хватало. Я, очевидно, могу и заменит «subSubmitHandler» анонимной функцией. Позвольте мне проверить это. Спасибо – user1032531

+0

Почему бы не просто 'submitHandler: mainSubmitHandler (form, subSubmitHandler)'? –

+0

@JeremyThille Оба решения будут работать. 'bind' позволяет вам передать область действия. Также вам нужно вернуть функцию при установке 'mainSubmitHandler (form, subSubmitHandler)' в свойство 'submitHandler' валидатора. – Mouser

1

Пропустите fonction в качестве дополнительного аргумента:

var mainSubmitHandler=function(form, secondFunction) { 
    //do a bunch of stuff 
    secondFunction(form); 
}; 

mainSubmitHandler(form, subSubmitHandler); 

Это то, что вы имеете в виду?

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

function doSomething(){ // not defining any arguments 
    console.log(arguments); // will output everything you passed the function 
} 

doSomething("Hello", someOtherFunction); 

Это работает так:

function doSomething(arg1, arg2){ // defining 2 arguments, but will accept more if given 
    console.log(arguments); // will output everything you passed the function 
} 

doSomething("First", "Second", someFunction, "third"); 

Вот почему многие строгие люди ненавидят Javascript, и почему я люблю его =)

+0

Если это сработает, да, это то, что я имею в виду. Я не знал, смогу ли я это сделать, и проверит это. Спасибо – user1032531

+0

Резервное копирование. При определении 'var validator', как добавить' secondFunction'? Я делаю что-то вроде 'submitHandler: mainSubmitHandler (function() {bla bla bla}):' – user1032531

+0

Вы можете сказать. Хотя это не очень элегантно или просто поддерживать. Если вы не хотите раскрывать свои функции глобально, храните их в объекте. Я обновил свой ответ, когда вы пишете свой второй комментарий, может быть, это поможет. –