【问题标题】:Pass function to submitHandler callback将函数传递给 submitHandler 回调
【发布时间】:2015-03-21 12:12:11
【问题描述】:

我将mainSubmitHandler 用于多个页面,如有必要,我愿意将其定义为全局变量。但是,mainSubmitHandler 需要进行一些调整,我正在使用subSubmitHandler 来处理这个问题。我怎样才能将 subSubmitHandler 作为另一个全局变量而不是将其作为 agrument 传递给 mainSubmitHandler

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
});

【问题讨论】:

  • 使用bind:mainSubmitHandler.bind(null, function)
  • @Mouser 请详细说明。

标签: javascript jquery jquery-validate anonymous-function


【解决方案1】:

您可以在此处使用bind

bind 包装了一个函数引用,允许您将范围和变量传递给目标函数:

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

参数:

  • thisArg:调用绑定函数时作为 this 参数传递给目标函数的值。如果绑定函数是使用 new 运算符构造的,则忽略该值。
  • 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.
});

【讨论】:

  • 啊,这就是我所缺少的。我显然可以并且会用匿名函数替换subSubmitHandler。让我测试一下。谢谢
  • 为什么不只是submitHandler: mainSubmitHandler(form, subSubmitHandler)
  • @JeremyThille 这两种解决方案都可以。 bind 允许您通过范围。此外,在将mainSubmitHandler(form, subSubmitHandler) 设置为验证器的属性submitHandler 时,您还需要返回一个函数。
  • @user1032531,当然,我使用您的代码,不会删除原始代码中的参数。您可以不使用它,应该可以正常工作。
  • 我尝试将其排除在外,因为我同意“当然”。但是,有了mainSubmitHandler,收到的第一个函数是subSubmitHandler,第二个是表单。我猜我没想到,但可以使用它。谢谢
【解决方案2】:

将函数作为附加参数传递:

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,而我喜欢它的原因 =)

【讨论】:

  • 如果它有效,是的,这就是我的意思。我不知道我是否可以这样做,并将对其进行测试。谢谢
  • 备份。定义var validator时,如何添加secondFunction?我会做类似submitHandler: mainSubmitHandler(function(){bla bla bla}): 的事情吗
  • 你可以。即使它不是非常优雅或易于维护。如果您不想全局公开您的函数,请将它们存储在一个对象中。在您撰写第二条评论时,我已经更新了我的答案,也许会有所帮助。
  • 这不会为 OP 的问题提供解决方案。他想将一个变量传递给通过验证器调用的mainSubmitHandler 函数。
  • 不是我所理解的。他们说“我不能将 subSubmitHandler 作为另一个全局变量,而是如何将它作为 agrument 传递给 mainSubmitHandler?”所以这实际上是一个必须传递的函数。或者问题根本不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多