我使用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,这是非常过时的,可能不支持音标器.