В механизме выбора автодополнения Awesomplete ключевую роль играет
преобразование выбранного элемента списка в итоговое значение поля
ввода. За этот этап отвечает функция replace, определяющая,
каким образом выбранное предложение будет записано в input-элемент после
клика или навигации клавиатурой.
replace в жизненном цикле выбора элементаПри взаимодействии с выпадающим списком Awesomplete проходит несколько стадий:
Именно на последнем этапе используется replace. Без её
участия библиотека применяет стандартное поведение: подставляет
текстовое представление элемента (обычно label или
строку).
Функция replace позволяет переопределить это поведение и
управлять тем, что именно окажется в input.value.
Если replace не задана явно, Awesomplete использует
стандартную стратегию:
label, либо
value, если он задан;Такой подход подходит для простых списков, где нет необходимости разделять отображаемое значение и фактическое значение.
Функция replace вызывается в момент выбора элемента и
получает доступ к текущему состоянию:
Типичная форма:
replace: function (suggestion) {
this.input.value = suggestion;
}
В простейшем случае replace полностью заменяет значение
input на строку или вычисленный результат.
Одно из основных назначений replace — разделение
UI-логики и данных.
Рассмотрим структуру элемента:
[
{ label: "Нью-Йорк", value: "NYC" },
{ label: "Лос-Анджелес", value: "LA" }
]
По умолчанию пользователь видит label, но иногда
требуется записывать в input не отображаемое значение, а код.
Без replace поведение может быть недостаточно гибким,
поскольку библиотека не всегда явно разделяет визуальное и внутреннее
представление. С использованием replace можно задать точную
логику:
replace: function (item) {
this.input.value = item.value;
}
Теперь поле ввода хранит код города, а не его название.
Часто требуется не просто подставить значение, а преобразовать его.
replace используется для:
Пример форматирования:
replace: function (item) {
this.input.value = item.label + " (" + item.value + ")";
}
В этом случае пользователь видит и название, и код, объединённые в одно значение.
При использовании API-данных элементы списка часто имеют вложенную структуру:
{
city: "Karaganda",
country: "Kazakhstan",
id: 1024
}
В таких случаях replace становится инструментом
сериализации:
replace: function (item) {
this.input.value = item.city + ", " + item.country;
}
Логика формирования строки полностью контролируется разработчиком и может учитывать любые поля объекта.
replace для токенизации вводаВ более сложных сценариях Awesomplete используется для ввода списков
значений (например, тегов). Тогда replace должен не
перезаписывать input, а дополнять его.
Пример сценария: ввод email-адресов через запятую.
replace: function (text) {
var before = this.input.value.split(/,\s*/).slice(0, -1).join(", ");
this.input.value = before + (before ? ", " : "") + text + ", ";
}
Здесь replace:
Такой подход превращает Awesomplete в основу для multi-select поведения.
Функция replace напрямую влияет на восприятие
интерфейса:
Неправильно настроенный replace может привести к
рассинхронизации между отображаемым текстом и реальными данными,
особенно если используется label/value модель.
replace от
item и labelВажно различать три уровня управления:
item — структура данных элемента;label — отображаемое значение;replace — финальная трансформация при выборе.label отвечает за визуализацию списка, тогда как
replace работает уже после выбора. Это означает, что
изменение label не обязательно влияет на итоговое значение
input, если replace переопределён.
Функция может быть задана на уровне конфигурации:
new Awesomplete(input, {
list: data,
replace: function (item) {
this.input.value = item.label;
}
});
Такой подход применяется для глобальной настройки поведения автодополнения в рамках конкретного поля.
this внутри
replaceВнутри replace контекст this указывает на
экземпляр Awesomplete, что позволяет:
this.input;Это делает функцию не просто преобразователем данных, а точкой интеграции с внутренним состоянием компонента.
Awesomplete допускает смешанные списки:
["Paris", "Berlin", { label: "Tokyo", value: "TYO" }]
replace в таких случаях должен учитывать тип данных:
replace: function (item) {
if (typeof item === "string") {
this.input.value = item;
} else {
this.input.value = item.value;
}
}
Такое разделение повышает устойчивость логики к неоднородным данным.
replace для интеграции с формамиВ формах с серверной валидацией часто требуется отправлять не текст,
а идентификатор. replace обеспечивает соответствие между UI
и backend-данными:
Это снижает необходимость постобработки на стороне сервера.
В сложных интерфейсах replace используется для:
Пример с нормализацией:
replace: function (item) {
this.input.value = item.name.normalize("NFC");
}
replace является завершающим звеном в цепочке
автодополнения, обеспечивая контроль над тем, как пользовательский выбор
превращается в данные формы. Именно на этом этапе происходит
окончательное согласование между отображаемым интерфейсом и внутренним
значением, которое будет использовано приложением или отправлено на
сервер.