Select2:标签与自定义DataAdapter无法正常工作

问题描述 投票:1回答:1

我正在使用自定义dataAdapter,并尝试使用Select2 jQuery插件中的'tags'属性。但是在文档中找到的例子根本不起作用,'tags'属性被简单地忽略(这只在使用自定义dataAdapter时发生,否则它正常工作)。

所以这不起作用:

$(".js-example-tags").select2({
  tags: true
});

作为解决方案,我发现我们可以在dataAdapter中使用Tags的装饰器,它确实有效!问题是,它总能奏效。因此,如果我在HTML中有两个'select'标签,并且我希望其中一个标签为'tags:true'而另一个标签为'tags:false',那么它们都会因为这个装饰器而启用标记。我试过设置'tags:false',但它不起作用。

我在想一个解决方案是在dataAdapter中,为装饰器创建一个if语句,以便应用它。但问题是,当创建第一个'select'时,此特定代码仅执行一次。

所以我想如果我使用dataAdapter创建多个选择,那么它们都将具有相同的装饰器。而且我认为拥有多个dataAdapter对我来说不是一个解决方案。

所以我的问题是,如果我有多个'select'元素,我如何使用不同的装饰器来应用它们?还使用相同的dataAdapter?

我也有一个JSFiddle:Tags with dataAdapter

谢谢!

javascript jquery-select2 jquery-select2-4
1个回答
3
投票

我们刚刚遇到这个问题,我一直无法找到关于如何“正确”实现这一点的任何内容。感觉有一个模式或钩我错过了select2应该提供here

我想出了两种方法来处理这个问题。

1. Handle adding the decorators up front of calling select2

(function ($) {
    var CustomDataAdapter = $.fn.select2.amd.require('select2/data/customDataAdapter');
    var Utils = $.fn.select2.amd.require('select2/utils');
    var Tags = $.fn.select2.amd.require('select2/data/tags');
    var MinimumInputLength = $.fn.select2.amd.require('select2/data/minimumInputLength');

    $.fn.mySelect2 = function(options) {
        if (!options.dataAdapter && options.customDataAdapterOptions) {
            options.dataAdapter = CustomDataAdapter;

            if (options.minimumInputLength > 0) {
                options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);
            }

            if (options.tags) {
                options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
            }
        }

        return this.select2(options);
    };
}(jQuery));

用法更改为:$('selector').mySelect2(options);

2. Override the Defaults.apply method that handles this for built in dataAdapters

(function() {
    var CustomDataAdapter = $.fn.select2.amd.require('select2/data/customDataAdapter');
    var Utils = $.fn.select2.amd.require('select2/utils');
    var Tags = $.fn.select2.amd.require('select2/data/tags');
    var MinimumInputLength = $.fn.select2.amd.require('select2/data/minimumInputLength');
    var baseApply = $.fn.select2.defaults.apply;

    $.fn.select2.defaults.apply = function (options) {
        if (!options.dataAdapter && options.customDataAdapterOptions) {
            options.dataAdapter = CustomDataAdapter;

            if (options.minimumInputLength > 0) {
                options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);
            }

            if (options.tags) {
                options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
            }
        }
        return baseApply.apply(this, arguments);
    };
}());

用法不会改变:$('selector').select2(options);

© www.soinside.com 2019 - 2024. All rights reserved.