Как отфильтровать ввод для поиска, чтобы показать правильное автозаполнение в JQUERY? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть вход для поиска, где мое автозаполнение показывает, но по какой-то причине оно не фильтрует результаты - кто-нибудь может сказать или показать мне способ отфильтровать результаты, чтобы показать правильное автозаполнение перед моим кодом ниже. Ниже приведен Формат JSON и HTML-код обновлен. Спасибо за помощь.

Вот мой код

       $( function() {
    var cache = {};
    $( "#searchTextField" ).autocomplete({
      minLength: 2,
      source: function( request, response ) {
        var term = request.term;
        if ( term in cache ) {
          response( cache[ term ] );
          return;
        }

        $.post( "http://localhost:8080/myApp/JobSearchItem.xhtml", request, 
        function( data, status, xhr ) {
          cache[ term ] = data;
          response( data );
        });
      }
    });
  } ); 

JobSearchItem Return JSON

[
   {
    "id": "9000",
    "label": "PROGRAMMER TEST 1 (9000) ",
    "value": "90000"
},
 ]

HTML

 <h:body>
<f:view transient="true">
  <tp:header/>
  <tp:searchForm/>



  <div id="results">

  </div>

 <h:panelGroup  id="dTable" class="container">
        </h:panelGroup>


</f:view>
   <f:view transient="true">
<div class="jobEntity">
  <div class="job-container-header">
    <h4>#{testBean.jobEntity.toString()}</h4>

    <c:if test="#{testBean.jobEntity.validURLConnection}">
      <a href="#{testBean.jobEntity.pGradeDescriptionLink}" 
         class="btn btn-info-One"   
         target="_blank">[ Test ]</a>
    </c:if>

    <h4>#{testBean.jobEntity.mu} - #{testBean.jobEntity.muDescription}</h4>
    <h4>#{testBean.jobEntity.specialNotes}</h4> 
    <h4>#{testBean.jobEntity.syRgeMnSepMsg}</h4>
  </div>

  <c:if test="${testBean.jobEntity.sectionToDisplay eq 'Range'}">
    <table class="table">
      <tbody>
        <tr>
          <th></th>
          <c:forEach var="stepNumber" begin="1" end="#{testBean.jobEntity.stepSize}">
            <th>Step #{stepNumber}</th>
          </c:forEach>
        </tr>
        <c:forEach items="#{testBean.jobEntity.jobRows}" var="jobRow">
          <tr>
            <th>#{jobRow.rateType}</th>
            <c:forEach items="#{jobRow.steps}" var="step">
              <td>#{step.amount}</td>
            </c:forEach>
          </tr>
        </c:forEach>
      </tbody>
    </table>
  </c:if>
</div>

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Поскольку вы вызываете данные из файла .xhtml, он не сможет отфильтровать результаты, если вы не сможете обновить сценарий на стороне сервера, чтобы принимать и выполнять действия на основе данных, отправленных в него.

Я бы посоветовал вам предварительно собрать статические данные и затем отфильтровать их. Это может выглядеть примерно так:

$( function() {
  var myData;
  $.get( "http://localhost:8080/myApp/JobSearchItem.xhtml", function( data ){
    myData = data;
  } );
  $( "#searchTextField" ).autocomplete( {
    minLength: 2,
    source: myData
  } );
} );

Предполагается, что ваш xhtml предоставляет массив данных (обычно в формате JSON). Это может быть просто:

[
  "Item 1",
  "Item 2",
  "Item 3"
];

Или что-то более продвинутое:

[{
  "label": "Item 1",
  "value": 1
},{
  "label": "Item 2",
  "value": 2
},{
  "label": "Item 3",
  "value": 3
}];

Если возвращаемые вами данные - это что-то другое: таблица HTML, XML или текст, то использование функции с источником поможет вам. Если вы обновите свой вопрос и предоставите пример данных, мы могли бы предоставить более полный пример или руководство.

Обновление 1

С учетом следующих данных JSON:

[{
  "id": "9000",
  "pGrade": "0",
  "label": "PROGRAMMER TEST 1"
},{
  "id": "6000",
  "pGrade": "0",
  "label": "WEB PROGRAMMER TEST 1"
}];

Это не соответствует стандартному автозаполнению ожидаемых данных. Если вы можете POST-данные к JobSearchItem.xhtml, вы можете сначала отфильтровать их и вернуть данные. Если JobSearchItem.xhtml не принимает POST, тогда я выполню GET всех данных заранее, а затем отфильтрую их. Я включу пример обоих.

POST

Если вы публикуете данные, серверный скрипт должен знать, какие данные вы отправляете, в виде имени и значения переменной. Вы не указали имя переменной в своем примере и не указали содержимое JobSearchItem.xhtml, поэтому очень сложно определить, как работает этот сценарий.

Для этого примера мы будем использовать term, а данные нашего примера будут we. Если бы это была команда GET, она бы выглядела так:

JobSearchItem.xhtml?term=we

Для публикации мы будем использовать предоставленный объект:

{ "term": "we" };

Вот основы:

$(function(){
  var cache = {};
  $("#searchTextField").autocomplete( {
    minLength: 2,
    source: function(request, response){
      var t = request.term;
      if (t in cache){
          response(cache[t]);
          return;
      }
      var results = [];
      $.ajax({
        url: "http://localhost:8080/myApp/JobSearchItem.xhtml",
        data: {
          term: t
        },
        dataType: "json",
        method: "POST",
        success: function( data, status, xhr ) {
          $.each(data, function(k, v){
            results.push({
              label: v.label,
              value: v.label,
              id: v.id,
              grade: v.pGrade
            });
          });
          cache[t] = results;
        });
        response(results);
      });
    }
  });
});

Итак, в этом случае, если пользователь вводит we, это отправляется в сценарий, который отфильтрует результаты и отправит обратно JSON, который должен выглядеть следующим образом:

[{
  "id": "6000",
  "pGrade": "0",
  "label": "WEB PROGRAMMER TEST 1"
}];

Поскольку автозаполнение ожидает, что объект, содержащий label и value, не может быть просто отправлен напрямую на response(). Используя $.each(), мы можем повторять результаты и настраивать их так, чтобы они форматировались для автозаполнения.

GET

Если ваш obSearchItem.xhtml статичен и предоставляет только список данных JSON, использование GET может быть хорошим способом сбора этих данных. Учтите, что вы можете получить все эти данные заранее, а затем использовать их позже. Это наиболее распространенный способ использования автозаполнения, но данные все еще должны быть в правильном формате.

$( function() {
  var myData = [];
  $.get("http://localhost:8080/myApp/JobSearchItem.xhtml", function(data){
    $.each(data, function(k, v){
      myData.push({
        label: v.label,
        value: v.label,
        id: v.id,
        grade: v.pGrade
      });
    });
  });
  $("#searchTextField").autocomplete({
    minLength: 2,
    source: myData
  });
});

Один из них должен работать.

0 голосов
/ 30 октября 2018

Когда вы указываете удаленный URL-адрес в качестве источника данных, подобного этому, ожидается, что удаленный сервер выполнит фильтрацию на основе критерия поиска, заданного ему автозаполнением, и вернет результаты, уже отфильтрованные.

Автозаполнение выполняет фильтрацию только в том случае, если вы предоставляете ему статические данные. Подробнее см. http://api.jqueryui.com/autocomplete/#option-source.

N.B. Если ваш удаленный сервер не может выполнить какую-либо фильтрацию (например, потому что он просто возвращает статический файл), вам придется отфильтровать данные на стороне клиента в вашем обратном вызове, прежде чем вы вернете их в автозаполнение. Но, конечно, это не очень эффективно, потому что вы продолжаете загружать все данные, а затем отбрасывать большую их часть (если браузер не кеширует их).

...