jQuery自动完成给出TypeError:this._renderItem(...)未定义

时间:2013-04-01 10:21:35

标签: jquery jquery-ui-autocomplete

我目前在页面的三个位置使用.data( "ui-autocomplete" )._renderItem = function( ul, item )。现在我需要再添加一个,我已经完成了。

但这次我收到错误消息

  

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语句,当我在其他两个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"}
]

1 个答案:

答案 0 :(得分: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)
    }
}

演示:Plunker