JQuery插件子方法

时间:2013-05-17 09:56:19

标签: javascript jquery typescript

我遇到一些问题,如何在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));
            }
        });
    }
}

1 个答案:

答案 0 :(得分: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(...);

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

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