0

我在不了解如何在 JQuery 插件中制作“子功能”时遇到了一些问题。我想要实现的是如下所示

var tags = $('#tagContainer').ImageTags({ option1: "blah blah", option1: "blah blah", option1: "blah blah"});
tags.ShowTagAdd(someIdHere, someOtherId);

原因是有时我需要在页面加载时强制显示我的 TagAdd 对话框,我可以通过选项来做到这一点,但我想让它更干净:D 这是我的代码到目前为止,它是用 TypeScript 编写的但它应该像普通的 JQuery 一样可读:D

当子函数被调用时,我基本上不会运行我的方法ShowTag(categoryid: number, characterId: number),我该怎么做?

    module ImageModule {
    export interface DefaultOptions {
        ImageId: number;
    }

    export class ImageTags {
        defaults: DefaultOptions = {
            ImageId: 0,
        };
        options: DefaultOptions;
        TagsContainer: JQuery;

        constructor(element: JQuery, options: DefaultOptions) {
            this.options = <DefaultOptions> $.extend({}, this.defaults, options);
            this.TagsContainer = element;
            var self = this;

        }


        ShowTag(categoryid: number, characterId: number) {
            console.log("test");
        }
    }

    $.fn["ImageTags"] = function (options) {
        return this.each(function () {
            if (!$.data(this, "plugin_ImageTags")) {
                $.data(this, "plugin_ImageTags", new ImageTags($(this), options));
            }
        });
    }
}
4

1 回答 1

2

存档的一种方法是:

$.fn.ImageTags = function(...) {

    return {
        ShowTagAdd: function(...) {

        }
    };

};

由于使用该方法返回一个对象,因此您可以按照您想要的方式进行操作,但这打破了 jQuery 可链接性理念。

它会更好:

(function($, undefined){

    $.fn.ImageTags = function(options) {

        var pluginName = 'ImageTags';
        var plugin = $(this).data(pluginName);

        if(plugin) {

            return plugin;

        } else {

            var settings = $.extend({}, options);

            return this.each(function() {

                var widget = $(this);

                var ShowTagAdd = function(...) {};

                var api = {
                    ShowTagAdd: ShowTagAdd
                };

                widget.data(pluginName, api);

            });

        }

    }

})(jQuery);

因此,您可以将您的方法定义为“私有”,并在 api 中公开您喜欢的方法:

tags.ImageTags().ShowTagAdd(...);

或者

tags.data('ImageTags').ShowTagAdd(...);

使用闭包的好处是您可以拥有一些私有方法。

还有其他方法,但我现在没有时间!

于 2013-05-17T10:08:52.707 回答