在jQuery插件中保存的设置返回未定义的jQuery插件函数

时间:2018-11-21 16:13:43

标签: jquery

我正在尝试访问jquery插件中保存的设置。我有一个保存在jquery数据中的设置列表。我想稍后在插件中包含的函数中访问这些设置。下面的插件代码。

(function ($) {
    var kendoEditWindowFunctions = {
        init: function (settings) {
            settings.validator = 
 $(this).kendoValidator().data("kendoValidator");
        $(this).data("settings", settings);
        $(settings.submitButton).click(function () {
            $(settings.Name).kendoEditWindow("Submit");
        });
    },

    OnBegin: function () {
        $(this).addClass("k-state-submit");
    },

    OnComplete: function () {
        $(this).removeClass("k-state-submit");
    },

    OnFailed: function (xhr) {
        AjaxErroMessage(data);
    },

    OnSuccess: function () {
        var settings = $(this).data("settings");
        if (settings.grid)
            $(settings.grid).data("kendoGrid").dataSource.read();
        $(this).kendoEditWindow("Close");
        notification.show({
            title: "Success",
            message: "Record has been saved successfully."
        }, "success");
    },

    Open: function (routeValues, e) {
        var settings = $(this).data("settings");
        var url = settings.fetchController + "/" + settings.fetchAction;
        if ($(e.currentTarget).data("grid-button")) {
            var grid = $(e.currentTarget).closest(".k-grid");
            var attributes = $(e.currentTarget).data();
            var uid = $(e.currentTarget).closest("tr").data("uid");
            var dataItems = $(grid).data("kendoGrid").dataSource.getByUid(uid);
            for (var key in attributes) {
                if (attributes.hasOwnProperty(key) && key.indexOf("editRouteProperty") >= 0) {
                    for (var key2 in attributes[key]) {
                        if (attributes[key].hasOwnProperty(key2)) {
                            routeValues[key2] = dataItems[attributes[key][key2]];
                        }
                    }

                }
            }
        }

        $.ajax({
            url: url,
            data: routeValues,
            beforeSend: function () {
                $(settings.window).addClass("k-state-loading");
            },
            complete: function () {
                setTimeout(function () {
                    $(settings.window).removeClass("k-state-loading");
                }, 500);
            },
            success: function (data) {
                $(settings.window).find(".form-container").html(data);


            },
            error: function () {
                $(settings.window).find(".form-container").html("Data load error");
            }

        });

        $(settings.window).data("kendoWindow").open();
    },

    Close: function () {
        $(this).data("kendoWindow").close();
    },

    Clear: function () {
        $(this).removeClass("k-state-submit");
        $(this).removeClass("k-state-loading");
        $(this).find(".form-container").html("");
    },

    Submit: function () {
        var settings = $(this).data("settings");
        if (settings.validator.validate())
            $(settings.form).submit();
    }
}

$.fn.kendoEditWindow = function (methodOrOptions) {
    if (kendoEditWindowFunctions[methodOrOptions]) {
        return kendoEditWindowFunctions[methodOrOptions].apply(this, 
Array.prototype.slice.call(arguments, 1));
        } else if (typeof methodOrOptions === "object" || !methodOrOptions) {
            return kendoEditWindowFunctions.init.apply(this, arguments);
        } else {
            $.error("Method " + methodOrOptions + " does not exist");
        }
    };

})(jQuery);

问题在于$(this).data(“ settings”)返回的Submit函数内部未定义。我不知道为什么。除了提交功能外,它在所有其他功能中都可以正常工作。我相信这确实很简单。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是$(settings.Name)与您最初用来初始化插件的元素不同

因此,当您执行$(settings.Name).kendoEditWindow("Submit");时,该插件将具有一个不同的this,其中没有任何数据集作为应用init()的原始元素< / p>

您可以尝试更改

$(settings.submitButton).click(function () {
    $(settings.Name).kendoEditWindow("Submit");
});

收件人

var _this = this
$(settings.submitButton).click(function () {
   $(_this).kendoEditWindow("Submit");
});

$(settings.submitButton).click(function () {
    kendoEditWindowFunctions.Submit()
});