选择2 v3.x
如果您有带有选项的本地数组(通过 ajax 调用接收),我认为您应该使用data
参数作为函数返回选择框的结果:
var pills = [{id:0, text: "red"}, {id:1, text: "blue"}];
$('#selectpill').select2({
placeholder: "Select a pill",
data: function() { return {results: pills}; }
});
$('#uppercase').click(function() {
$.each(pills, function(idx, val) {
pills[idx].text = val.text.toUpperCase();
});
});
$('#newresults').click(function() {
pills = [{id:0, text: "white"}, {id:1, text: "black"}];
});
小提琴:http : //jsfiddle.net/RVnfn/576/
如果您使用按钮自定义 select2 界面,只需在更新数据数组(例如药丸)后调用updateResults
(此方法不允许从 select2 对象的外部调用,但您可以根据allowedMethods
需要将其添加到 select2 中的数组)方法。
select2 v4:自定义数据适配器
updateOptions
具有附加(不清楚为什么原始缺少此功能)方法的自定义数据适配器ArrayAdapter
可用于动态更新选项列表(本示例中的所有选项):
$.fn.select2.amd.define('select2/data/customAdapter',
['select2/data/array', 'select2/utils'],
function (ArrayAdapter, Utils) {
function CustomDataAdapter ($element, options) {
CustomDataAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(CustomDataAdapter, ArrayAdapter);
CustomDataAdapter.prototype.updateOptions = function (data) {
this.$element.find('option').remove(); // remove all options
this.addOptions(this.convertToOptions(data));
}
return CustomDataAdapter;
}
);
var customAdapter = $.fn.select2.amd.require('select2/data/customAdapter');
var sel = $('select').select2({
dataAdapter: customAdapter,
data: pills
});
$('#uppercase').click(function() {
$.each(pills, function(idx, val) {
pills[idx].text = val.text.toUpperCase();
});
sel.data('select2').dataAdapter.updateOptions(pills);
});
小提琴: https ://jsfiddle.net/xu48n36c/1/
select2 v4:ajax传输功能
在 v4 中,您可以定义可以与本地数据数组一起使用的自定义传输方法(例如,谢谢 @Caleb_Kiage,我玩过它但没有成功)
文档:https ://select2.github.io/options.html#can-an-ajax-plugin-other-than-jqueryajax-be-used
Select2 使用 ajax.transport 中定义的传输方法向您的 API 发送请求。默认情况下,此传输方法是 jQuery.ajax,但可以更改。
$('select').select2({
ajax: {
transport: function(params, success, failure) {
var items = pills;
// fitering if params.data.q available
if (params.data && params.data.q) {
items = items.filter(function(item) {
return new RegExp(params.data.q).test(item.text);
});
}
var promise = new Promise(function(resolve, reject) {
resolve({results: items});
});
promise.then(success);
promise.catch(failure);
}
}
});
但是使用这种方法,如果数组中的选项文本发生更改,您需要更改选项的 ID - 内部 select2 dom 选项元素列表未修改。如果数组中选项的 id 保持不变 - 将显示以前保存的选项,而不是从数组中更新!如果仅通过向其添加新项目来修改数组,这不是问题- 对于大多数常见情况来说都可以。
小提琴: https ://jsfiddle.net/xu48n36c/3/