Переопределение родительской функции в $.widget
Пробую написать плагин, который расширяет стандартный автокомплит: я получаю на странице JSON с айдишниками элементов, и айдишниками значений. Потом в цикле вызываю эти элементы, проставляя всем Айди значения.
//вместо цикла, для примера var elem="#stat"; var data[elem]=10 ; $(elem).idautocomplete("id",data[elem]); Каждый элемент сам идёт на сервер и получает текстовое значение этого айдишника, которое уже и отображает. Однако возникает необходимость потом собрать значения айдишников с каждого элемента(потому как их могли поменять) крайне неудобно для каждого элемента прописывать колбэк и в нём присваивать айдишник какой-то переменной, а потом из этой переменной этот айдишник брать. $("#login").autocomplete({ source: "/test.aspx", select: function (event, ui) { cur_employee = ui.item ? ui.item.id : "null"; } }); В общем я не придумал ничего лучше как попробовать переопределить select и сохранять эти данные в самом моём плагине. Однако я столкнулся с проблемой, что когда я захожу в sel в плагине, я не вижу никаких переменных своего плагина. И такое ощущение, что я нахожусь в этот момент в родительском ui.autocomplete Подскажите пожалуйста, как можно решить такую проблему или каким другим способом можно решить всю задачу получения ранее изменённых значений из плагина. Не в момент изменения, а позже. Вот код проблемного плагина. ; (function ($, window, document, undefined) { $.widget("my.idautocomplete", $.ui.autocomplete, { // дополнительные настройки зададим позже options: { oldselect:{}, id:"" }, _selected_item:{ }, // конструктор плагина. _create: function () { // вызовем в нем конструктор родительского плагина $.ui.autocomplete.prototype._create.call(this); this.options.oldselect=this.options.select; this.options.select=this.sel; }, // деструктор плагина destroy: function () { // вызовем в нем деструктор родительского плагина $.ui.autocomplete.prototype.destroy.call(this); }, sel:function (event, ui) { console.log("sel"); if(this.options!==undefined ){ ?// сюда не заходим и this.options.id не видим this.options.id=ui.item.id; if( proto(this.options.oldselect)=="function"){ this.options.oldselect.apply(event, ui); } } }, // обработка изменения свойств _setOption: function () { $.ui.autocomplete.prototype._setOption.apply(this, arguments); }, id: function (ui){ if (ui!==undefined) { console.log("Setting Val: " + ui); var IDAC=this; $.get(IDAC.options.source ,{id:ui}, function (ret) { // то что возвращается: [{"id":"10","label":"Ленинская","value":"Ленинская"}] var json = JSON.parse(ret); if (json) { $(IDAC.element[0]).val(json[0].label); IDAC.options.id=ui; } }); } ?// соответственно тут всё время старое значение return this.options.id ? this.options.id : "null"; } }); })(jQuery, window, document); вот так инициализируется плагин: $("#stat").idautocomplete({ source: "/test.aspx", minLength: 0 }); <input id="stat"/> |
Часовой пояс GMT +3, время: 02:15. |