ここでの問題は、4.0.0 リリースの Select2 が、結果の照会と結果の表示を分離していたことです。このためsorter
、結果を並べ替えるために通常使用するオプションは、作成されたクエリ (検索語を含む) には渡されません。
したがって、ソート時に使用できるように、作成されたクエリをキャッシュする方法を見つける必要があります。results の検索語に下線を引くことに関する私の回答では、テンプレート メソッドを使用してクエリをキャッシュしますloading
。これは、検索が行われるたびに常にトリガーされます。ここでも同じ方法が使えます。
var query = {};
$element.select2({
language: {
searching: function (params) {
// Intercept the query as it is happening
query = params;
// Change this to be appropriate for your application
return 'Searching…';
}
}
});
sorter
これで、保存されたquery
(およびquery.term
検索語として使用する)を使用するカスタム メソッドを構築できます。私の例の並べ替え方法では、検索結果が結果を並べ替えるテキスト内の位置を使用しています。これはおそらくあなたが探しているものと似ていますが、これはかなり強引な方法です。
function sortBySearchTerm (results) {
// Don't alter the results being passed in, make a copy
var sorted = results.slice(0);
// Array.sort is an in-place sort
sorted.sort(function (first, second) {
query.term = query.term || "";
var firstPosition = first.text.toUpperCase().indexOf(
query.term.toUpperCase()
);
var secondPosition = second.text.toUpperCase().indexOf(
query.term.toUpperCase()
);
return firstPosition - secondPosition;
});
return sorted;
};
そして、これにより、あなたが探している方法で物事が並べ替えられます。以下に、すべてのパーツを接続した完全な例を示します。質問で言及した 3 つのオプション例を使用しています。
var query = {};
var $element = $('select');
function sortBySearchTerm (results) {
// Don't alter the results being passed in, make a copy
var sorted = results.slice(0);
// Array.sort is an in-place sort
sorted.sort(function (first, second) {
query.term = query.term || "";
var firstPosition = first.text.toUpperCase().indexOf(
query.term.toUpperCase()
);
var secondPosition = second.text.toUpperCase().indexOf(
query.term.toUpperCase()
);
return firstPosition - secondPosition;
});
return sorted;
};
$element.select2({
sorter: sortBySearchTerm,
language: {
searching: function (params) {
// Intercept the query as it is happening
query = params;
// Change this to be appropriate for your application
return 'Searching…';
}
}
});
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>
<select style="width: 50%">
<option>banana orange apple</option>
<option>banana apple orange</option>
<option>apple banana orange</option>
</select>