Библиотека Awesomplete работает поверх стандартных HTML-элементов ввода и опирается на универсальную модель данных, позволяющую использовать как простые строки, так и структурированные объекты. Понимание того, как устроены объекты данных внутри Awesomplete, критично для построения расширяемых списков автодополнения, особенно в случаях, когда требуется отображение дополнительной информации, кастомная сортировка или динамическое формирование подсказок.
Awesomplete поддерживает два основных формата источников данных:
Строковый формат используется для простых сценариев:
new Awesomplete(input, {
list: ["Apple", "Apricot", "Avocado"]
});
Однако при переходе к объектной модели структура данных становится более гибкой:
new Awesomplete(input, {
list: [
{ label: "Apple", value: "apple" },
{ label: "Apricot", value: "apricot" },
{ label: "Avocado", value: "avocado" }
]
});
В объектной форме библиотека разделяет два ключевых понятия:
Объект, используемый в Awesomplete, может быть минимально представлен следующими полями:
Поле label определяет текст, который пользователь видит
в выпадающем списке.
Пример:
{ label: "New York", value: "NYC" }
Если объект содержит только одно поле label, Awesomplete
может использовать его как отображаемое и как подставляемое значение
одновременно.
Поле value определяет фактическое значение, которое
будет вставлено в input после выбора элемента.
Пример поведения:
{ label: "JavaScript", value: "js" }
Awesomplete может создавать внутренние ключи для оптимизации поиска и сопоставления. При передаче объектов без явной структуры библиотека нормализует их в единый формат.
Если в список передается массив строк, Awesomplete автоматически преобразует их в объектную форму:
["Berlin", "Bern", "Bergen"]
Преобразуется внутренне в:
[
{ label: "Berlin", value: "Berlin" },
{ label: "Bern", value: "Bern" },
{ label: "Bergen", value: "Bergen" }
]
Это позволяет унифицировать обработку данных независимо от исходного формата.
Хотя официально Awesomplete использует только label и
value, разработчики часто расширяют объект для собственных
нужд:
{
label: "Tokyo",
value: "TYO",
country: "Japan",
population: 37_000_000
}
Дополнительные поля не участвуют в логике библиотеки, но могут использоваться в пользовательских расширениях:
При поиске совпадений Awesomplete опирается на строковое
представление объекта. Обычно используется label,
преобразованный к строке.
Логика упрощенно выглядит так:
labelПример:
{ label: "San Francisco", value: "SFO" }
Поиск выполняется по строке "San Francisco".
["Red", "Green", "Blue"]
Характеристики:
[
{ label: "Red", value: "#ff0000" },
{ label: "Green", value: "#00ff00" },
{ label: "Blue", value: "#0000ff" }
]
Характеристики:
Awesomplete допускает передачу функции вместо массива. В этом случае структура объектов формируется динамически:
new Awesomplete(input, {
list: function (text, callback) {
callback([
{ label: text + "1", value: "A" },
{ label: text + "2", value: "B" }
]);
}
});
Здесь структура объектов становится результатом вычисления, а не статического массива.
При инициализации Awesomplete выполняет нормализацию:
label и valueЭто позволяет библиотеке поддерживать единый формат обработки независимо от входных данных.
Правильное использование структуры объектов напрямую влияет на пользовательский опыт:
label улучшает читаемость подсказокvalue обеспечивает корректную передачу данных в
формуПример полезной структуры:
{
label: "Berlin — Germany",
value: "berlin",
code: "DE-BE"
}
Несмотря на гибкость, структура объектов в Awesomplete имеет ограничения:
label и
valueПри создании кастомных расширений Awesomplete структура объектов становится основой для:
В таких случаях объект перестает быть просто контейнером данных и превращается в модель доменной сущности.
[
{
label: "Python",
value: "python",
type: "language",
popularity: 1
},
{
label: "JavaScript",
value: "javascript",
type: "language",
popularity: 2
},
{
label: "Go",
value: "go",
type: "language",
popularity: 3
}
]
Такая структура позволяет:
Ключевым принципом Awesomplete является предсказуемость:
Это делает структуру данных стабильной основой для построения автодополнения в любых сценариях использования.