Я пытаюсь расширить плагин автозаполнения jQuery UI 1.8.16 по умолчанию, чтобы сделать несколько вещей:
- Проверка массива значений, а не только метки / значения при поиске совпадения
- Визуализация элемента меню в другом шаблоне на основе категории элемента
Итак, чтобы сделать это, я начал работать с кодом. Я очень новичок в написании виджетов / плагинов, и поэтому мне интересно, если кто-то может помочь мне понять эту часть. В настоящее время я пытаюсь сделать следующее:
$.widget("custom.advautocomplete", $.ui.autocomplete, {
filter: function (array, term) {
var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
return $.grep(array, function (value) {
return matcher.test(value.label || value.alldata || value);
});
},
_renderMenu: function (ul, items) {
var self = this,
currentCat = "";
$.each(items, function (index, item) {
if (currentCat != item.category) {
ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
currentCat = item.category;
}
self._renderItem(ul, item);
});
},
_renderItem: function (ul, item) {
return $("<li></li>")
.data("item.autocomplete", item)
.append($("<a></a>").text(item.alldata))
.appendTo(ul);
}
});
Код _renderMenu
в значительной степени взят непосредственно из примера в документации. Код _renderItem
работает и в этом примере. Что не работает, так это код фильтра. Я заметил, что код фильтра определен в библиотеке jQuery следующим образом:
$.extend($.ui.autocomplete, {
escapeRegex: function (value) {
return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
},
filter: function (array, term) {
var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
return $.grep(array, function (value) {
return matcher.test(value.label || value.value || value);
});
}
});
Из того, что я до сих пор понял, это расширение jQuery autocomplete
, которое было определено ранее вызовом $.widget("ui.autocomplete"...
Но почему это обрабатывается таким образом? Почему эти две функции не обрабатываются внутри определения виджета, как все остальное? Я заметил, что если я расширяю ui.autocomplete
так же, как это делает базовый виджет, тогда я могу заставить работать переопределение фильтра. Я хотел бы расширить контроль и одновременно включить новый фильтр, чтобы мой код был немного чище, но я не понимаю, почему это делается так. Есть ли польза, которую я упускаю?