我使用Select2来管理大量数据.用户表示希望能够将列表粘贴到Select2字段,以便一次选择各种项目,而不是手动输入和匹配列表中的每个项目.
我尝试使用tokenSeparator来分离列表中的项目.这和demo on tokens in the documentation导致我相信,我希望做的是可能的,但到目前为止我没有喜悦.
我用来实例化Select2的代码是:
$('input').select2({
width: 'element',matcher: function (term,text) {
return text.toupperCase().indexOf(term.toupperCase()) === 0;
},minimumInputLength: 3,multiple: true,data: tagList,// tagList is an array of objects with id & text parameters
placeholder: 'Manage List',initSelection: function (element,callback) {
var data = [];
$.each(function () {
data.push({id: this,text: this});
});
callback(data);
},tokenSeparators: [',',' ']
});
只是为了澄清,在所有其他方面,select2字段的作品.只要将列表粘贴到字段中时,没有匹配项.我想测试粘贴列表中的所有项目.这是可能的,如果是这样,怎么样?
编辑:我尝试了以下代码,但似乎不起作用:
$('body').on('paste','#s2id_list-unitids .select2-input',function () {
var that = this;
setTimeout(function () {
var tokens = that.value.split(/[\,\s]+/);
$('#list-unitids').val(tokens,true);console.log($('#list-unitids').select2('val'));
},1);
});
这里是我创建的小提琴:http://jsfiddle.net/KCZDu/.
解决方法
select2提供了一个让您预处理输入的tokenizer选项.这是一个可能的实现为您的特定用途:
tokenizer: function(input,selection,callback) {
// no comma no need to tokenize
if (input.indexOf(',')<0) return;
var parts=input.split(",");
for (var i=0;i<parts.length;i++) {
var part=parts[i];
part=part.trim();
// todo: check for dupes (if part is already in [selection])
// check if the part is valid
// todo: you will need a better way of doing this
var valid=false;
for (var j=0;j<unitIds.length;j++) {
if (part===unitIds[j]) { valid=true; break; }
}
if (valid) callback({id:part,text:part});
}
}
这里是一个工作小提琴:http://jsfiddle.net/XcCqg/38/
还要注意你原来的小提琴使用select2 3.2,这是非常过时的,可能不支持音标器.