2013-04-01 57 views
1

我目前在我的頁面的三個地方使用.data("ui-autocomplete")._renderItem = function(ul, item)。現在我需要再添加一個,我完成了。jQuery自動完成給出TypeError:this._renderItem(...)是未定義的

但這次我得到錯誤信息

TypeError: this._renderItem(...) is undefined

奇怪的是,我只得到這一點,如果我的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"} 
] 
+0

http://stackoverflow.com/questions/5590776/why-am-i-讓這個js錯誤 – Techie

+0

http://stackoverflow.com/questions/9513251/cannot-set-property-renderitem-of-undefined-jquery-ui-autocomplete-with-html – PSR

回答

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

+0

啊哈!謝謝你清理那個。這擺脫了錯誤信息。但是現在它返回零結果,除非我在他寫的第一行代碼中添加了一個'else {}'語句。 但是,爲什麼我現在得到這個,而不是在另外兩個地方完成同樣的檢查? – Steven

+0

這可能是因爲您缺少默認行爲,請嘗試更新 –

+0

否,仍爲空列表。我嘗試過不同的變化。唯一有效的方法是在else語句中加入以下內容:return this._renderItem(ul,item).data(「ui-autocomplete-item」,item);'。我試圖做的一點是,爲什麼我需要一個else語句而不是其他自動完成函數? – Steven

相關問題