У меня есть следующая функция jquery:
$("#cliente").select2({
placeholder: '--select--',
minimumInputLength: 3,
ajax: {
url: path+'js/php-files/autocomplete.php',
dataType: 'json',
delay: 250,
data: function (params) {
return {
term: params.term // search term
};
},
results: function (data) {
return {
results: data.results
};
}
}
});
В файле PHP (autocomplete.php) у меня есть:
$bo = new ClienteBO();
$list = $bo->findAutoComplete($_GET['term']);
$results = array();
$first = true;
$count = count($list);
for ($i = 0; $i < $count; $i++) {
$results['id'] = $list[$i]['codCliente'];
$results['text'] = htmlspecialchars($list[$i]['nomeCliente']);
}
$ret['results'] = $results;
echo json_encode($ret);
И HTML-файл
<div class="form-group">
<label for="cliente">Cliente:</label>
<select name="cliente" id="cliente" class="form-control">
<option></</option>
</select>
</div>
Когда я вижу ошибку Chrome консоли, я получаю следующий результат:
Uncaught TypeError: b.slice is not a function select2.min.js:2
a.removePlaceholder @ select2.min.js:2
j @ select2.min.js:1
a.append @ select2.min.js:2
j @ select2.min.js:1
(anonymous function) @ select2.min.js:1
d.invoke @ select2.min.js:1
d.trigger @ select2.min.js:1
e.trigger @ select2.min.js:2
(anonymous function) @ select2.min.js:2
(anonymous function) @ select2.min.js:2
(anonymous function) @ jquery.min.js:2
j @ jquery.min.js:2
k.fireWith @ jquery.min.js:2
x @ jquery.min.js:4
b @ jquery.min.js:4
Я использую плагин select2 версии 4.0.0.
Как я могу разрешить эту ситуацию?
Спасибо!
Я получаю точно такую же ошибку, я использую laravel, я получаю ошибку только тогда, когда я использую ajax-запрос для получения значений из контроллера. Я понял, что в одном случае это работало, а в другом это вызывало эту ошибку. Использование коллекции вот что я отправил с контроллера:
РАБОТАЕТ:
PHP
$query = Exchange::where('active', 1)->select(['id', 'name as text'])->get()->toArray();
return json_encode(['results' => $exchanges]);
JSON
{"results":[{"id":12,"text":"Binance"}]}
НЕ РАБОТАЕТ:
PHP
$bases = ExchangePair::where('active', 1)->get()->pluck('base')->unique()->toArray();
json_encode(['results' => $bases]);
JSON
{"results":{"0":{"id":12,"text":"BTC"},"4":{"id":120,"text":"456"},"5":{"id":1,"text":"ETH"},"12":{"id":119,"text":"USDT"},"102":{"id":3,"text":"BNB"}}}
ПРОБЛЕМА
Я понял, что это было форматирование. То, как форматирование изменялось из-за уникальной функции, цифровые клавиши теряли последовательность. Я подозреваю, что виноваты ключи массива или формат массива, который вы выплевываете.
ВОЗМОЖНОЕ РЕШЕНИЕ
Я получил это работает, когда я пытался использовать функцию values () для сбросить клавиши ARRAY.
PHP
$bases = ExchangePair::where('active', 1)->get()->pluck('base')->unique()->values()->toArray();
json_encode(['results' => $bases]);
JSON
{"results":[{"id":12,"text":"BTC"},{"id":120,"text":"456"},{"id":1,"text":"ETH"},{"id":119,"text":"USDT"},{"id":3,"text":"BNB"}]}
^ Небольшое примечание: убедитесь, что ваш ответ на консоли chrome выглядит как строка выше, означая, что перед каждым объектом json нет цифровых клавиш, а все «результаты» заключены в массив.
Appendum:
У меня также была эта проблема, когда в моем массиве были нулевые значения. Вышеупомянутое решение частично исправило это в том, что при первом отображении опций это работало бы, когда я начал фильтровать это, не было бы из-за наличия нулевых значений. Удачи.
$bo = new ClienteBO();
$list = $bo->findAutoComplete($_GET['term']);
$results = array();
$first = true;
$count = count($list);
for ($i = 0; $i < $count; $i++) {
$results['id'] = $list[$i]['codCliente'];
$results['text'] = htmlspecialchars($list[$i]['nomeCliente']);
$ret['results'][$i] = $results;
}
echo json_encode($ret);