我目前在页面的三个位置使用.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"}
]
答案 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