【问题标题】:jQuery plugin: Define defaults for NESTED optionsjQuery 插件:定义 NESTED 选项的默认值
【发布时间】:2012-05-24 04:43:44
【问题描述】:

我想为这样的嵌套选项定义默认值:

$("div").filters({
          url     : 'url.example.com'
          filters : {
              'projects'    : {
                    'type'  : 'dropdown',
                    'min'   : 1,
                    'max'   : 10,
                    'htmlOptions': {
                         'name' : 'projects',
                         'class': 'filters',
                         'id'   : 'project-filter',
                     }                          
               },
               'another'    : {
                    'type'  : 'dropdown'
               }
               ...
          }
});

我使用 jQuery $.extend() 将这些与我的插件代码中的默认值合并,如下所示:

settings = $.extend(defaults,options);

我的代码太大了,可以全部放在这里。

我遇到的问题是settings.url 可以工作,但我不知道如何对settings.filters 做同样的事情,因为我不知道开发人员要在这里放置多少过滤器。

谁能提出一个更好的方法来解决这个问题?

我被困住了。谢谢

【问题讨论】:

  • 用户可以初始化多少个过滤器?您是否知道所有过滤器名称,或者它们是由用户创建的并且可以命名?
  • 我想让开发人员可以随意命名。但是,如果这不起作用。我可以硬编码所有这些,因为我知道它们。它们总共大约有 8 个,但在某些情况下只使用了两个。所以如果你明白我的意思,我最好允许这种类型的灵活性?

标签: jquery plugins nested options extend


【解决方案1】:

因为您希望允许开发人员随意命名过滤器,所以我假设您不想为每个特定过滤器设置任何默认值(您不知道它们的名称!)。

但是,您需要为 filters 设置一个默认的空对象。 所以你的 defaults 可能是:

var defaults = {
    url : '',
    filters: {}
};

现在,在合并之后,你需要遍历 filters 对象,看看是否有任何过滤器传入。

看到这个问题: iterating-a-javascript-objects-properties-using-jquery

所以你需要这样的东西:

$.each(settings.filters, function(filterName, value) {
    alert(filterName + ": " + value);
});

其中 value 将是您的过滤器对象{}

您可以使用每个循环来访问过滤器对象内的所有属性。

但是,如果您希望开发人员能够仅初始化过滤器的某些属性 - 例如在您的示例中,过滤器 another 仅指定了 type - 您需要使用一组默认过滤器属性扩展每个过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多