我正在使用Select2 (版本3.4.0)来填充标记列表。标签通过ajax调用与现有的标签进行匹配,我使用createSearchChoice
来创建新的标签。到目前为止,代码运行正常,如下所示:
$(mytags).select2({
multiple: true,
placeholder: "Please enter tags",
tokenSeparators: [ "," ],
ajax: {
multiple: true,
url: myurl,
dataType: "json",
data: function(term, page) {
return {
q: term
};
},
results: function(data, page) {
return data;
}
},
createSearchChoice: function(term) {
return {
id: term,
text: term + ' (new)'
};
},
});
除了注意createSearchChoice
中附加的(new)
之外,所有这些都是非常标准的。我需要用户知道这不是一个预先存在的标签。
它按照预期工作:如果我开始输入"new- tag ",我会得到列表顶部建议的"new-tag (new)“标签,如果我选择它,标签列表就会像预期的那样包含"new-tag (new)”。如果标签已经存在,Select2会检测到匹配,并且不会创建“(新)”选项。按return键或单击匹配项即可正常工作。
当我输入一个逗号(我的单个tokenSeparators
条目)而有一个匹配项时,问题就出现了。Select2关闭该标记,并将标记添加到列表中,但附加了“(新)”标签,即它使用来自createSeachChoice
的返回值,即使它不需要这样做。
这是Select2中的一个bug,还是我用错了(我应该怎么做)?
发布于 2014-02-25 00:08:38
与其推送结果,我认为在服务器端工作会更好。
如果服务器没有找到标签,让它返回一个带有新标签的json应答
{"more":false,"results":[{"id":"whatever","text":"new-tag (new)"}]}
发布于 2014-10-16 22:45:35
'createSearchChoice‘还有另一个参数-- 'page',它列出了所有的选项,你可以很容易地用它找到受骗者。
createSearchChoice = function (term, page) {
if( page.some(function(item) {
return item.text.toLowerCase() === term.toLowerCase();
}) ){
return { val: term, name: term + '*' };
}
}
https://stackoverflow.com/questions/16606092
复制相似问题