我正在使用自定义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
谢谢!
我们刚刚遇到这个问题,我一直无法找到关于如何“正确”实现这一点的任何内容。感觉有一个模式或钩我错过了select2应该提供here。
我想出了两种方法来处理这个问题。
(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);
(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);