如何在 jquery-select2 中的排序函数中获取查询字符串或容器
How to get query string or container in sorter function in jquery-select2
有什么方法可以获取查询字符串或我在排序器函数中附加 select2 的元素吗?我在页面上有多个下拉菜单,因此无法通过这种方式获取查询字符串:
$('.select2-search__field').val().toLowerCase()
我正在使用本地数据集,因此选项已经在下拉列表中。
$('.js-select').select2({
sorter: select2Sorter
});
function select2Sorter(results) {
...
}
您问题的简单答案是 "no"。您不能从 sorter
函数
中引用任何 select2 内部函数
为什么会这样?
如果您查看 select2 来源,尤其是 result.js
file, line 93,您会看到 sort
函数如下所示:
Results.prototype.sort = function (data) {
var sorter = this.options.get('sorter');
return sorter(data);
};
因此,它不会将任何上下文传播到传递的 sorter
函数,也不会提供更多参数。
解决方案
一种快速而肮脏的修复方法是覆盖 sort
函数以提供 this
上下文。这可以通过以下方式完成(假设您有 *.full.js
版本的 select2):
$.fn.select2.amd.require('select2/results').prototype.sort = function (data) {
var sorter = this.options.get("sorter");
// pass the `this` context
return sorter.call(this, data);
};
现在,每次调用 sorter
函数时,您都可以访问 select2 内部函数,并且可以做任何您想做的事情,例如
$('#e1').select2({
sorter: function (data) {
// get the search field of the current select2 element
var $searchField = this.data.$element.data("select2")
.$dropdown.find(".select2-search__field");
// log it's value
console.log($searchField.val());
return data;
}
});
这里有一个 JSFiddle 演示了这个概念。
有什么方法可以获取查询字符串或我在排序器函数中附加 select2 的元素吗?我在页面上有多个下拉菜单,因此无法通过这种方式获取查询字符串:
$('.select2-search__field').val().toLowerCase()
我正在使用本地数据集,因此选项已经在下拉列表中。
$('.js-select').select2({
sorter: select2Sorter
});
function select2Sorter(results) {
...
}
您问题的简单答案是 "no"。您不能从 sorter
函数
为什么会这样?
如果您查看 select2 来源,尤其是 result.js
file, line 93,您会看到 sort
函数如下所示:
Results.prototype.sort = function (data) {
var sorter = this.options.get('sorter');
return sorter(data);
};
因此,它不会将任何上下文传播到传递的 sorter
函数,也不会提供更多参数。
解决方案
一种快速而肮脏的修复方法是覆盖 sort
函数以提供 this
上下文。这可以通过以下方式完成(假设您有 *.full.js
版本的 select2):
$.fn.select2.amd.require('select2/results').prototype.sort = function (data) {
var sorter = this.options.get("sorter");
// pass the `this` context
return sorter.call(this, data);
};
现在,每次调用 sorter
函数时,您都可以访问 select2 内部函数,并且可以做任何您想做的事情,例如
$('#e1').select2({
sorter: function (data) {
// get the search field of the current select2 element
var $searchField = this.data.$element.data("select2")
.$dropdown.find(".select2-search__field");
// log it's value
console.log($searchField.val());
return data;
}
});
这里有一个 JSFiddle 演示了这个概念。