传递给插件时函数未定义

时间:2018-09-11 20:13:42

标签: jquery

我编写了一个插件进行验证,并在该插件的选项中传递了一个函数,但是传递的函数未定义,因此我不确定为什么

在文档中,我已经将插件称为

$('#btnSaveBlade').on('click', function () {
    $('#BladeInputs').AW_Validation({
        container: '#BladeInputs',
        attribute: 'aw-is-required',
        complete: SaveNewClient("Client")
    });
});

这是插件的一部分

$.fn.AW_Validation = function (options) {
    var settings = $.extend({
        container: null,
        attribute: null,
        //complete: null, // Callback function on successful completion <- didn't work
        complete: function(){},// Callback function on successful completion <- doesn't work either
        summary: null,
        notification: null
    }, options);
    ...
}

我不确定这是什么问题或问题是什么

1 个答案:

答案 0 :(得分:1)

当您将SaveNewClient(...)传递给插件时,您实际上是在调用它,因为它可能会返回undefined那就是您所得到的

尝试更改:

$('#BladeInputs').AW_Validation({
    container: '#BladeInputs',
    attribute: 'aw-is-required',
    complete: SaveNewClient("Client")
});

对于

$('#BladeInputs').AW_Validation({
    container: '#BladeInputs',
    attribute: 'aw-is-required',
    complete: function(){ SaveNewClient("Client"); }
});

或者更好

$('#BladeInputs').AW_Validation({
    container: '#BladeInputs',
    attribute: 'aw-is-required',
    complete: SaveNewClient.bind(null, "Client")
});

编辑:进一步的解释

从内到外对表达式进行求值,就像您运行{a: 1 + 1}一样,然后首先对1 + 1求值,从而得到{a: 2}

类似的功能也会发生以下情况:

function onePlusOne() { return 1 + 1; }

让我们看下面的示例:

$.yourPlugin(
       $.extend({ a: onePlusOne() }, { b: 2}))

然后onePlusOne()将首先运行评估为2,然后将$.extend({ a: onePlusOne() }, { b: 2})评估为{a: 2, b: 2},这是$.yourPlugin()收到的信息

现在想象onePlusOne()没有返回值,在这种情况下,javascript将返回undefined,这就是您的complete最终被传递的原因