Автозаполнение JSON, jQueryUI, AJAX — не удается получить данные, когда массив не является локальным

#ajax #json #jquery-ui #autocomplete

#ajax #json #jquery-пользовательский интерфейс #автозаполнение

Вопрос:

Я искал stackoverflow, а также в Интернете, чтобы получить представление о том, как заставить плагин автозаполнения jQueryUI работать с моими данными JSON, и я в недоумении. У меня это работало как шарм с локальным массивом данных. Я смог извлечь значения и создать html.

Я столкнулся с проблемой, когда мне пришлось извлекать JSON из этого источника:

 /Search/AjaxFindPeopleProperties2 
  

?txtSearch=ca извлекает тестовые данные, которые я пытаюсь просмотреть, когда я ввожу ‘ca’ для заполнения списка автозаполнения. Одна из проблем заключается в том, что ?term=ca добавляется к URL вместо ?txtSearch=ca, и я не уверен, как его изменить.

Это пример данных:

 {

"MatchedProperties": [
    {
        "Id": 201,
        "Name": "Carlyle Center",
        "Description": "Comfort, convenience and style are just a few of the features you'll ...",
        "ImageUrl": "/Photos/n/225/4989/PU__ThumbnailRS.jpg"
    }

 ]

}
  

… и вот вызов ajax, который я пытаюсь реализовать:

 $(document).ready(function () {


    val = $("#txtSearch").val();

    $.ajax({

        type: "POST",
        url: "/Search/AjaxFindPeopleProperties2",
        dataType: "json",
        data: "{}",
        contentType: "application/json; charset=utf-8",

        success: function (data) {
            $('#txtSearch').autocomplete({
                minLength: 0,
                source: data.d, //not sure what this is or if it's correct
                focus: function (event, ui) {
                    $('#txtSearch').val(ui.item.MatchedProperties.Name);

                        $.widget("custom.catcomplete", $.ui.autocomplete, {

                            //customize menu item html here
                            _renderItem: function (ul, item) {
                                return $("<li class='suggested-search-item"   " "   currentCategory   "'></li>")
                            .data("item.autocomplete", item)
                            .append($("<a><img src='"   item.MatchedProperties.ImageUrl   "' /><span class='name'>"   item.MatchedProperties.Name   "</span><span class='location'>"   "item.location"   "</span><span class='description'>"   item.MatchedProperties.Description   "</span></a>"))
                            .appendTo(ul);
                            },

                            _renderMenu: function (ul, items) {
                                var self = this,
                                currentCategory = "Properties Static Test Category";
                                $.each(items, function (index, item) {
                                    if (item.category != currentCategory) {
                                        ul.append("<li class='suggested-search-category ui-autocomplete-category'>"   currentCategory   "</li>");
                                        //currentCategory = item.category;
                                    }
                                    self._renderItem(ul, item);
                                });
                            }

                        }//END: widget
                    //return false;
                },
                select: function (event, ui) {
                    $('#txtSearch').val(ui.item.MatchedProperties.Name);
                    //$('#selectedValue').text("Selected value:"   ui.item.Abbreviation);
                    return false;
                }
            });
        },

        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }

    }); //END ajax





}); //END: doc ready
  

и я инициализирую здесь:

 <script type="text/javascript">

    //initialize autocomplete
$("#txtSearch").autocomplete({ //autocomplete with category support
        /*basic settings*/
        delay: 0,
        source: "/Search/AjaxFindPeopleProperties2",
        autoFocus: true,
        minLength: 2 //can adjust this to determine how many characters need to be entered before autocomplete will kick in
    });
//set auto fucus
    $("#txtSearch").autocomplete("option", "autoFocus", true);


</script>
  

любая помощь была бы отличной…

Спасибо!

Комментарии:

1. Вы пытаетесь разместить свои элементы по категориям? (просто интересно, я вижу определение пользовательского виджета, которое помещает элементы в категории в выпадающем меню)

2. Можете ли вы показать больше данных, возвращаемых службой? source опция ожидает массив (будь то массив строк или массив объектов типа { label: '', value: ''} . Если источником является URL-адрес, вы должны вернуть json, но все равно представлять массив. Отображаемая вами часть данных не похожа на массив (см. Документ / Обзорный текст)