我很好奇如何以某些需要的方式为jQuery插件指定选项,有些可选地被覆盖,有些则无法触及。
我开始平常:
jQuery.fn.plugin = function (options){
var defaults = { username: "", posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
}
假设我需要username
,posts
是可选的(默认为10),而您(您是该插件的用户)无法更改api
,甚至如果他们尝试理想情况下,它们仍然处于相同的数据结构中,而不是分成单独的对象。想法?
答案 0 :(得分:5)
$.fn.plugin = function(username, options) {
if (!username) throw "Must provide a username.";
var config = $.extend({}, $.fn.plugin.defaults, options);
var privateVal = 4;
...
}
$.fn.plugin.defaults = {
posts: 10
}
以下是摘要:
extend
函数填写默认值。你通常会有一些“默认值”来收集它们。我喜欢将这些内容作为名称间距的插件名称本身 - 并作为有用选项的有用文档。throw
。答案 1 :(得分:1)
如果你想要用户名,我会把它作为一个参数,因为它是唯一需要的东西,你不想用这种方式做20个参数。像这样:
jQuery.fn.plugin = function (username, options){
var defaults = { posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
}
在单个传递的对象中没有一个干净的必需的方法来完成完全,至少不是一个简单的,这是你想要的API。另一种方法是指定没有默认值和警报,或者如果它不在我想象的那样:
jQuery.fn.plugin = function (options){
var defaults = { posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
if(typeof options.username == 'undefined') {
alert("You must specify a username");
return this;
}
}
编辑 - 错过了部分问题,对于无法访问的问题,要么使用硬编码值,因为这是相同的结果,或者更清洁一点是插件中的内部对象在其他地方超出范围。同样,除非你一直说出一个intenalDefaults
对象,并且在>> 设置的扩展之后用调用jQuery.extend()
,所以它会覆盖同一个对象并不容易。消费者传入。