2013-03-27 4 views
9

У меня есть следующий код. Он не генерирует ошибок js. Не удается получить автозаполнение, чтобы показать результаты:jquery autocomplete renderItem

$(function() { 
    $.ajax({ 
    url: "data.xml", 
    dataType: "xml", 
    cache: false, 
    success: function (xmlResponse) { 
     var data_results = $("Entry", xmlResponse).map(function() { 
      return { 
       var1: $.trim($("Partno", this).text()), 
       var2: $.trim($("Description", this).text()), 
       var3: $.trim($("SapCode", this).text()), 
       var4: $("Title", this).text(), 
       var5: $.trim($("File", this).text()), 
       var6: $.trim($("ItemID", this).text()) 
      }; 
     }).get(); 

     $("#searchresults").autocomplete({ 
      source: data_results, 
      minLength: 3, 
      select: function (event, ui) { 
       ... 
      } 
     }).data("autocomplete")._renderItem = function(ul, item) { 
       return $("<li></li>").data("item.autocomplete", item) 
        .append("<a>" + item.var1 + "<br>" + item.var2 + "</a>") 
        .appendTo(ul); 
     }; 

    } 
}); 

Любые идеи, что мне может не хватать? Заранее спасибо.

ответ

5

По умолчанию автозаполнение ожидает ваш исходный массив содержит объекты либо свойство label, свойство value, или обоих.

Имея это в виду, у вас есть два варианта:

  1. Добавить метку или значение свойства ваших исходных объектов при обработке массива из вашего вызова AJAX:

    var data_results = $("Entry", xmlResponse).map(function() { 
        return { 
         var1: $.trim($("Partno", this).text()), 
         var2: $.trim($("Description", this).text()), 
         var3: $.trim($("SapCode", this).text()), 
         var4: $("Title", this).text(), 
         var5: $.trim($("File", this).text()), 
         var6: $.trim($("ItemID", this).text()), 
         value: $.trim($("Description", this).text()) 
        }; 
    }).get(); 
    

    The value вам назначение будет использоваться на focus, select, а также для поиска по.

  2. Изменение функции source для выполнения пользовательской фильтрации логики:

    $("#searchresults").autocomplete({ 
        source: function (request, response) { 
         var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
    
         response($.grep(data, function (value) { 
          return matcher.test(value.var1) || 
            matcher.test(value.var2); 
          /* etc., continue with whatever parts of the object you want */ 
         })); 
        }, 
        minLength: 3, 
        select: function (event, ui) { 
         event.preventDefault(); 
         this.value = ui.var1 + ui.var2; 
        }, 
        focus: function (event, ui) { 
         event.preventDefault(); 
         this.value = ui.var1 + ui.var2; 
        } 
    }).data("autocomplete")._renderItem = function(ul, item) { 
         return $("<li></li>").data("item.autocomplete", item) 
          .append("<a>" + item.var1 + "<br>" + item.var2 + "</a>") 
          .appendTo(ul); 
    }; 
    

    Обратите внимание, что с помощью этой стратегии вы должны реализовать пользовательский select и focus логики.