1

.data( "ui-autocomplete" )._renderItem = function( ul, item )現在、ページの 3 か所で使用しています。もう 1 つ追加する必要があり、これで完了です。

しかし、今回はエラーメッセージが表示されます

TypeError: this._renderItem(...) は未定義です

奇妙なことは、IFテストが偽の場合にのみこれを取得することです。

 .data( "ui-autocomplete" )._renderItem = function( ul, item ) {

  // If only one row is returned and ID = 0, then return 'no result' message
  if(item.id == '0') {
    return jQuery( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<div class='no-result'>"+ item.value + "</div>" )
        .appendTo( ul );
  }

他の 3 か所ではなく、ここで失敗する理由がわかりません。どこか矛盾していませんか?

これは私のコードです

jQuery('#my-selector').autocomplete({
  minLength: 2,
  source: function( request, response ) {
    jQuery.ajax({
        url: callback_url,
        dataType: "json",
        data: {
                term: request.term
        },
        success: function( data ) {
          response( jQuery.map( data, function( item ) {
            return {
              id: item.id,
              value: item.name,
              name_encoded: item.name_encoded
            }
        }));
      }
    });
  },
  select: function( event, ui ) {
        return false;
  }
}).data( "ui-autocomplete" )._renderItem = function( ul, item ) {
  if(item.id == '0') {
    return jQuery( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<div class='no-result'>"+ item.value + "</div>" )
        .appendTo( ul );
  }
};

アップデート

この変更は機能します。elseしかし、他の 2 つの関数でステートメントを使用していないのに、なぜここでステートメントを使用する必要があるのか​​ 、まだ理解できませんautocomplete

.data( "ui-autocomplete" )._renderItemData = function( ul, item ) {
        if(item.id == '0') {
                return jQuery( "<li></li>" )
                        .data( "item.autocomplete", item )
                        .append( "<div class='no-result'>"+ item.value + "</div>" )
                        .appendTo( ul );
        } else {
            return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
        }

};

検索語を含むクエリからデータを返すsome

[
  {"id":"8186","name":"Some Are Thieves"},
  {"id":"6149","name":"Somet"},
  {"id":"6150","name":"Somethin'Else from SKECHERS"}
]
4

1 に答える 1

6

テストが失敗した場合、_renderItemを返すのと同等の値を返さないのはテストのためundefinedです。

ただし_renderItem、以下のように呼び出され、jquery がデータ値を戻り値に設定しようとするため、エラーが発生します。

return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );

あなたの場合、_renderItemData代わりにオーバーライドする必要があります_renderItem

var el = $('<my-autocomplete-element>');
var _renderItemData = el.data("ui-autocomplete")._renderItemData;
el.data("ui-autocomplete")._renderItemData = function(ul, item) {

    // If only one row is returned and ID = 0, then return 'no result' message
    if (item.id == '0') {
        return jQuery("<li></li>").data("item.autocomplete", item).data(
                "ui-autocomplete-item", item).append("<div class='no-result'>"
                + item.value + "</div>").appendTo(ul);
    } else {
        _renderItemData.apply(this, arguments)
    }
}

デモ:プランカー

于 2013-04-01T10:25:15.850 に答える