在 select2 3.5.2 中使用 initSelection 进行自定义过滤
Using initSelection in select2 3.5.2 for custom filtering
我有一个使用 select2 的文本字段。这是初始化:
$("#foo").select2({
createSearchChoice:function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term)===0;
}).length===0)
{return {id:term, text:term};}
},
initSelection : function (element, callback) {
var data = {id: element.val(), text: element.val()};
callback(data);
},
tags:[],
tokenSeparators: [","],
data: [...data goes here...]
});
在此字段中,用户应输入数字或列表中的 select 项。如果用户放入的项目没有出现在列表中,它应该被创建为一个简单的标签(id 和文本相同)。这行得通。
当我以编程方式设置值时不起作用:
myvar.find('.placeholder lorem-ipsum').val(number).trigger("change");
它现在的工作方式是,当我将它设置为任何值时,它会毫无怨言地接受它,创建一个新的简单标签。但是,如果我要完全删除 initSelection 参数,它将忽略未知值,并使用从列表中获取的已知值(其中标签很复杂 - id 和文本不同)。
如何才能让我设置的字段值在列表中找到时使用该项目,否则做一个简单的标签?它现在的工作方式(仅限简单标签)在某种程度上是可以接受的,但我更希望它能理想地工作。
编辑:
我已经举例说明它如何使用和不使用 initSelection 参数。
http://jppk.byethost12.com/with.html
http://jppk.byethost12.com/without.html
简而言之,我希望它在我按 "Add New Item" 时像 with.html 一样工作,我希望它在我按 "Add Existing Item" 时像 without.html 一样工作。
这是我对你想要的最好的解释。
诀窍是将元素附加到 select 字段。
var array = ['foo', 'bar', 'baz']
$.each(array, function(key, value) {
appendSelect(value);
});
$("#foo").select2();
$('#submit').click(function() {
var val = $('#name').val();
$('#name').val('');
array.push(val);
appendSelect(val);
});
function appendSelect(value) {
$('#foo').append($("<option></option>").text(value));
}
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0-rc.1/css/select2.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0-rc.1/js/select2.min.js"></script>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<div class='container'>
<select id='foo' multiple="multiple" class='form-control'></select>
<label>Input</label>
<input id='name' />
<button id='submit'>submit</button>
</div>
很久很久以后,我找到了一个有效的解决方案:
initSelection : function (element, callback) {
var eArr = element.val().split(",");
var data = [];
for (var i=0;i<eArr.length;i++) {
for (var j=0;j<preExistingData.length;j++) {
if (preExistingData[j]["id"] === eArr[i]) {
data.push(preExistingData[j]);
continue;
}
}
data.push({id: eArr[i], text: eArr[i]});
}
callback(data);
},
这不仅检查该值是否在预先存在的值中(在这种情况下它使用该项目),而且还检查该值是否是以逗号分隔的值列表(在这种情况下它正确地封装它们作为 JS 对象)。
我有一个使用 select2 的文本字段。这是初始化:
$("#foo").select2({
createSearchChoice:function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term)===0;
}).length===0)
{return {id:term, text:term};}
},
initSelection : function (element, callback) {
var data = {id: element.val(), text: element.val()};
callback(data);
},
tags:[],
tokenSeparators: [","],
data: [...data goes here...]
});
在此字段中,用户应输入数字或列表中的 select 项。如果用户放入的项目没有出现在列表中,它应该被创建为一个简单的标签(id 和文本相同)。这行得通。
当我以编程方式设置值时不起作用:
myvar.find('.placeholder lorem-ipsum').val(number).trigger("change");
它现在的工作方式是,当我将它设置为任何值时,它会毫无怨言地接受它,创建一个新的简单标签。但是,如果我要完全删除 initSelection 参数,它将忽略未知值,并使用从列表中获取的已知值(其中标签很复杂 - id 和文本不同)。
如何才能让我设置的字段值在列表中找到时使用该项目,否则做一个简单的标签?它现在的工作方式(仅限简单标签)在某种程度上是可以接受的,但我更希望它能理想地工作。
编辑: 我已经举例说明它如何使用和不使用 initSelection 参数。
http://jppk.byethost12.com/with.html
http://jppk.byethost12.com/without.html
简而言之,我希望它在我按 "Add New Item" 时像 with.html 一样工作,我希望它在我按 "Add Existing Item" 时像 without.html 一样工作。
这是我对你想要的最好的解释。
诀窍是将元素附加到 select 字段。
var array = ['foo', 'bar', 'baz']
$.each(array, function(key, value) {
appendSelect(value);
});
$("#foo").select2();
$('#submit').click(function() {
var val = $('#name').val();
$('#name').val('');
array.push(val);
appendSelect(val);
});
function appendSelect(value) {
$('#foo').append($("<option></option>").text(value));
}
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0-rc.1/css/select2.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0-rc.1/js/select2.min.js"></script>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<div class='container'>
<select id='foo' multiple="multiple" class='form-control'></select>
<label>Input</label>
<input id='name' />
<button id='submit'>submit</button>
</div>
很久很久以后,我找到了一个有效的解决方案:
initSelection : function (element, callback) {
var eArr = element.val().split(",");
var data = [];
for (var i=0;i<eArr.length;i++) {
for (var j=0;j<preExistingData.length;j++) {
if (preExistingData[j]["id"] === eArr[i]) {
data.push(preExistingData[j]);
continue;
}
}
data.push({id: eArr[i], text: eArr[i]});
}
callback(data);
},
这不仅检查该值是否在预先存在的值中(在这种情况下它使用该项目),而且还检查该值是否是以逗号分隔的值列表(在这种情况下它正确地封装它们作为 JS 对象)。