4

入力したクエリに一致する結果のみを返すように typeahead.js を取得するのに問題があります。たとえば、会社の検索バーに「Facebook」と入力すると、すべての会社 (「Yahoo」、「Google」など) が返されますが、これらのほとんどはクエリに一致しません。サーバー側のデータ処理は行っていません。私の datumTokenizer 関数はこのフィルタリングを処理する必要がありますか?

また、クエリを変更するたびに、データごとに filter() 関数が入力されることに気付きました。したがって、クエリを「G」から「Go」に変更すると、filter: function (company_list) の console.log() ステートメントが 3000 回出力されます。

これが私のコードです:

var companies = new Bloodhound({
    datumTokenizer: function (datum) {
      return Bloodhound.tokenizers.whitespace(datum.name);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
      url: '/json/company_list.json',
      filter: function (companies_list) {
        // Map the remote source JSON array to a JavaScript object array
        return $.map(companies_list, function (company) {
          console.log('mapping')
          return {
            name: company.name
          };
        });
      }
    }
  });

  // Initialize the Bloodhound suggestion engine
  var promise = companies.initialize();
  promise.done(function() {console.log('Bloodhound initialized!')});

  // passing in `null` for the `options` arguments will result in the default
  // options being used
  $('#form-company').typeahead(null, {
    name: 'companies',
    displayKey: 'name',
    // `ttAdapter` wraps the suggestion engine in an adapter that
    // is compatible with the typeahead jQuery plugin
    source: companies.ttAdapter()
  });

そして、私のURLが返すものの例:

[{"name": "Yahoo"}, {"name": "Sanchai Technologies "}, {"name": "Oliver Wyman"}, {"name": "University of Oregon"}, ...]

プリフェッチがまったく機能しないため、リモートを使用しています。[object Object] という提案だけが表示されますが、これは意味がありません。prefetch/remote を使用して、初期化時に .json ファイル全体をロードし、サーバーにそれ以上の要求を行わないようにしたいと考えています。したがって、プリフェッチは私にとってより良いオプションだと思います(小さなファイル、77kB)が、まったく機能していません。

助けてくれてありがとう!

4

2 に答える 2