4

私のSelect2は3.5で正しく動作していました..

v4.0 (「フル」ではなく、必要に応じてキーワード/機能を変更) にアップグレードしてから、余分な AJAX 呼び出しが行われるという奇妙な問題が発生しました。ただし、URL が定義されていないため、404 Not Found エラーが生成されます。URL はhttps://localhost:8443/myapp/undefined です。

それらは、存在する templateResult と templateSelection に関連しているようです。それらをコメントアウトすると、select2 は正しく機能します (ただし、データはフォーマットされていません)。

それらをコメントアウトしないと、初期化時に不思議な/未定義のAJAX呼び出しが1回発生し、選択ボックスをクリックすると1回、次に入力する文字ごとに1回呼び出されます(minimumInputLengthを設定しても)。ただし、これらの偽の AJAX 呼び出しを使用しても、私の「本物の」ajax 呼び出しは実行され、結果 (templateResult/templateSelection によって適切にフォーマットされます) が返されます。「escapeMarkup」の有無にかかわらず、動作に違いはありませんでした。

これらの不適切な AJAX 呼び出しを引き起こしているのは何ですか?どうすれば停止できますか? (そうでなければ、それはうまく機能しているため)

前もって感謝します!

編集 ここに、問題を示す完全なページがあります。追加のネットワーク呼び出しは、formatResult 関数で使用するタグによって生成されます。しかし、「読み込み中」状態にあるはずなのに、なぜ html を返すのでしょうか?

さて、「プレースホルダー」を設定すると、読み込み変数が設定されないことが判明したため、html が返されます (不正な形式のタグ付き)。

そのため、プレースホルダーが設定されている場合、templateResult と templateSelection も空の ID をチェックする必要があります。

if (result.id == "" || result.loading) return result.text;

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<title></title>

<link rel="stylesheet" href="${pageContext.request.contextPath}/lib/select2/dist/css/select2.css" />
</head>
<body>

<form id="organization_lookup_form" class="form-horizontal" >
<div>
    Select2 using placeholder <select id="search1" style="width:300px"></select>
</div>
<div style="padding-top:250px">
    Select2 WITHOUT placeholder <select id="search2" style="width:300px"></select>  
</div>
</form>

<script src="${pageContext.request.contextPath}/lib/jquery/dist/jquery.min.js"></script>
<script src="${pageContext.request.contextPath}/lib/select2/dist/js/select2.min.js"></script>
<script>
$(document).ready(function () {
      function formatResult (result){
          console.log('%o', result);
          if (result.loading) return result.text;
          var html = '<div>'+
                '<img src="' + result.image + '">' +
                '<h4>'+result.label+'</h4></div>';
          return html;
      };

      $('#search1').select2({
          placeholder: "Search...",
          ajax: {
              url: '/search',
              dataType: 'json',
              data: function (params, page) {
                  return {
                      term: params.term, // search term
                      page: page
                  };
              },
              processResults: function (data, page) {
                  return {results: data.results};
              },
              cache: true
          },
          templateResult : formatResult,
          templateSelection : formatResult,
          escapeMarkup: function(m) {
              // Do not escape HTML in the select options text
              return m;
           },
          minimumInputLength: 3
      });
      $('#search2').select2({
//        placeholder: "Search...",
          ajax: {
              url: '/search',
              dataType: 'json',
              data: function (params, page) {
                  return {
                      term: params.term, // search term
                      page: page
                  };
              },
              processResults: function (data, page) {
                  return {results: data.results};
              },
              cache: true
          },
          templateResult : formatResult,
          templateSelection : formatResult,
          escapeMarkup: function(m) {
              // Do not escape HTML in the select options text
              return m;
           },
          minimumInputLength: 3
      });
});
</script>

</body>
</html>
4

2 に答える 2

1

ここには、表示されている要求につながる可能性のある問題がいくつかあります。

  1. Select2 では、textオブジェクトの属性が人間が読めるバージョンのオプションを指す必要があります。これは、オプションのマッチングやアクセシビリティの目的でバックグラウンドで使用されるため、使用することが重要です。
  2. オプションが設定されているかどうかを確認するだけloadingです。これは、「検索中...」テキストのみを処理している場合は機能しますが、他の何かが処理されている場合は機能しません。image代わりに、プロパティが存在しないことを確認することをお勧めします。これはundefined、これらの場合のようです。

そして、あなたが尋ねた特定の質問に答えるために

これらの不適切な AJAX 呼び出しを引き起こしているのは何ですか?どうすれば停止できますか?

Select2 は検索中にリモート リクエストのみをトリガーするため、追加のリクエストはコード内で生成する必要があります。あなたの場合、これは結果に画像を表示しようとしていたためでしたが、オブジェクトに実際に画像が存在しない場合を処理していませんでした。

しかし、「読み込み中」状態にあるはずなのに、なぜ html を返すのでしょうか?

このtemplateResultメソッドは、「検索中...」メッセージなど、結果に表示される通知の多くをフォーマットするときに使用されます。これにより、これらのメッセージに特別なフォーマットを適用できますが、テンプレート メソッドでそれらを処理する必要があることも意味します。text通常、人間が読めるバージョンのオプションを表示するために通常使用されるプロパティを定義するため、これは問題になりませんが、このプロパティが使用されていない場合は問題が発生します。

于 2015-06-11T02:46:03.247 に答える