Автозаполнение пользовательского интерфейса jQuery: загрузка из массива объектов: фильтрация нарушена - PullRequest
0 голосов
/ 25 мая 2019

Я слежу за JSFiddle, данным в этой теме в качестве решения для загрузки автозаполнения пользовательского интерфейса jQuery из простого массива объектов:

http://jsfiddle.net/khsbme4k/

Фильтрация здесь нарушена. Есть 2 строки данных со строкой First_Name, «Will» и «Willem», но если вы наберете что-нибудь еще, например, «ВА» вы все равно получаете полный выбор из 2 предметов, где их не должно быть.

  var data = [
        {
            "id": 1,
            "first_name": "Will",
            "last_name": "Smith",
            "created_at": "2015-01-27T13:09:20.243Z",
            "updated_at": "2015-01-27T13:09:20.243Z"
        },
        {
            "id": 2,
            "first_name": "Willem",
            "last_name": "Dafoe",
            "created_at": "2015-01-27T13:17:23.479Z",
            "updated_at": "2015-01-27T13:17:23.479Z"
        }
    ];

$('#search').autocomplete({
        // This shows the min length of charcters that must be typed before the autocomplete looks for a match.
        minLength: 2,
source: function (request, response) {
           response($.map(data, function (value, key) {
                return {
                    label: value.first_name,
                    value: value.id
                }
            }));

    },    
        focus: function(event, ui) {
            $('#search').val(ui.item.first_name);
            return false;
        },
        // Once a value in the drop down list is selected, do the following:
        select: function(event, ui) {
            // place the person.given_name value into the textfield called 'select_origin'...
            $('#search').val(ui.item.first_name);
            // and place the person.id into the hidden textfield called 'link_origin_id'. 
            $('#link_origin_id').val(ui.item.id);
                return false;
        }

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Рассмотрим следующий пример кода вашего source:

source: function(request, response) {
  var results;
  var aData = $.map(data, function(value, key) {
    return {
      label: value.first_name,
      value: value.id
    }
  });
  results = $.ui.autocomplete.filter(aData, request.term);
  response(results);
}

Сначала мы сопоставим ваши данные с { label, value } парами, которые ожидает автозаполнение. Затем мы используем $.ui.autocomplete.filter() для выполнения ожидаемой фильтрации, как это делает автозаполнение. Это дает нам наш массив результатов, который мы можем отправить на response() для отображения.

Рабочий пример: https://jsfiddle.net/Twisty/svnbw2uj/3/

Надеюсь, это поможет.

1 голос
/ 25 мая 2019

Используйте метод indexOf (), чтобы получить список автозаполнения элемента поиска.

     $(function() {
    var data = [
        {
            "id": 1,
            "first_name": "Will",
            "last_name": "Smith",
            "created_at": "2015-01-27T13:09:20.243Z",
            "updated_at": "2015-01-27T13:09:20.243Z"
        },
        {
            "id": 2,
            "first_name": "Willem",
            "last_name": "Dafoe",
            "created_at": "2015-01-27T13:17:23.479Z",
            "updated_at": "2015-01-27T13:17:23.479Z"
        }
    ];

var auto_array = {};
$('#search').autocomplete({
	// This shows the min length of charcters that must be typed before the autocomplete looks for a match.
	minLength: 2,
source: function (request, response) {
	   response($.map(data, function (value, key) {
	   
			//get the list of autocomplete start with search value. for case insensitive i used the toUpperCase() function.
			var first_name = value.first_name.toUpperCase()
			if(first_name.indexOf(request.term.toUpperCase()) != -1){
				label = value.first_name;
				auto_array[label] = value.id;
				return label;
			}else{
				return null;
			}
		}));

},    
	
	 select: function(event, ui) {
	 $('#link_origin_id').val(auto_array[ui.item.value]);
	  }
					
});
});
 
<link href = "https://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css" rel = "stylesheet">
<script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

    <input type="text" id="search">
	<input type="text" id="link_origin_id">
	
...