2012-12-28 35 views
4

如何覆盖_renderItem只有#global-search覆盖_renderItem和_renderMenu

$("#global-search").autocomplete({ 
    //  
})._renderMenu = function(ul, items) { 
    var self = this; 
    ul.append('<table class="ac-search-table"></table>'); 
    $.each(items, function(index, item) { 
    self._renderItem(ul.find("table"), item); 
    }); 
}); 
+0

你想在这里覆盖'_renderItem'或'_renderMenu'吗? – raina77ow

+0

两者,我有这样的工作:$ .ui.autocomplete.prototype._renderMenu = ...和..._ renderItem但我有多个AC在页面上,只希望其中一个重写他们的功能。 –

+0

然后我想最好按照我在答案中显示的方法。您可以在自己的方法中定义一些通用功能,然后使用实例方法覆盖它。 – raina77ow

回答

13

请记住,您可以通过data应对jQuery UI的工厂方法(_create)创建的小部件的特定实例:

var widgetInst = $("#global-search").autocomplete({}).data('ui-autocomplete'); 

...或者,因为jQuery UI的1.12,通过instance()帮手方法:

var widgetInst = $("#global-search").autocomplete('instance'); 

因此你能够覆盖它的方法与自己:

widgetInst._renderMenu = function(ul, items) { 
    var self = this; 
    ul.append('<table class="ac-search-table"></table>'); 
    $.each(items, function(index, item) { 
    self._renderItem(ul.find("table"), item); 
    }); 
}; 
+0

widgetInst.renderMenu的最后一行应该从“});”至 ”};” (对不起,我会自己编辑它,但是SO有一个可怕的政策,需要6个或更多字符进行编辑) – Michael

+0

啊,谢谢。 )我自己编辑了答案。 – raina77ow

+1

你好,这个解决方案还在工作吗?我尝试了没有成功 – user

0

你有两个选择:

  1. 您可以覆盖_renderItem功能,使得它的一些对象比较内部,要么调用原来_renderItem功能或执行自定义代码。

  2. 您可以创建一个继承自autocomplete的新小部件并覆盖那里的功能。