我遇到一些问题,如何在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));
}
});
}
}
答案 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(...);
使用闭包的好处是你可以使用一些私有方法。
还有其他方法,但我现在没有时间!