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

因此,这是行不通的:

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


作为解决方案,我发现我们可以在dataAdapter中为Tag使用装饰器,它确实有效!问题是,它将始终有效。因此,如果我在HTML中有两个“选择”标签,并且我希望其中一个具有“ tags:true”,而另一个具有“ tags:false”,则由于此装饰器,它们都将启用标记。我试过设置'tags:false',但是不起作用。

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

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

所以我的问题是,如果我有多个“选择”元素,如何为每个元素使用不同的装饰器?还使用相同的dataAdapter吗?

我也为此有一个JSFiddle:
Tags with dataAdapter

谢谢!

最佳答案

我们也碰到了这一点,而我却找不到任何有关如何“正确”实现这一点的东西。感觉有一个模式或挂钩,我想念的是select2应该提供here

我想出了两种处理方法。

1.处理在调用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.重写处理内置DataAdapters的Defaults.apply方法

(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);

关于javascript - Select2:标记无法与自定义DataAdapter一起正常使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49171808/

10-12 00:42