Пробую написать плагин, который расширяет стандартный автокомплит: я получаю на странице 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"/>