我有一个输入(textarea),其上应用了Select2标签。因此,当用户键入我的数据库中存在的项目的名称时,它会显示匹配项目的列表,用户可以选择一个,并创建一个标记。
到目前为止,我的代码是基本标记功能:
$('#usualSuppliers').select2({
placeholder: "Usual suppliers...",
minimumInputLength: 1,
multiple: true,
id: function(e) {
return e.id + ":" + e.name;
},
ajax: {
url: ROOT + 'Ajax',
dataType: 'json',
type: 'POST',
data: function(term, page) {
return {
call: 'Record->supplierHelper',
q: term,
page_limit: 10
};
},
results: function(data, page) {
return {
results: data.suppliers
};
}
},
formatResult: formatResult,
formatSelection: formatSelection,
initSelection: function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
title: item[1]
});
});
//$(element).val('');
callback(data);
}
});
如果输入的文字不存在,是否有办法创建新标签?最初我认为这可以通过用空格分隔来完成,但是有些项目(供应商名称)会有空格,所以不会起作用。
我认为当找不到匹配项时,用户需要以某种方式"创建"通过按下可能出现在下拉框中的按钮来标记,但我不知道如何执行此操作。
如何允许用户创建可能包含空格的新标签,并且仍然可以继续添加更多标签,现有或其他?
答案 0 :(得分:8)
是的,你可以做到。文档中有一个例子。看http://ivaynberg.github.io/select2/#events
$("#e11_2").select2({
createSearchChoice: function(term, data) {
if ($(data).filter( function() { return this.text.localeCompare(term)===0;
}).length===0) {
return {id:term, text:term};
}
},
multiple: true,
data: [{id: 0, text: 'story'},{id: 1, text: 'bug'},{id: 2, text: 'task'}]
});
你必须创建一个像createSearchChoice这样的函数,它返回一个带有'id'和'text'的对象。在其他情况下,如果您返回undefined,则不会创建选项。