Я использую typeahead.js с Bloodhound для поиска пользователей с использованием локального источника:
let users = [
{name: 'John Doe ([email protected])', value: '3421'},
{name: 'Jane Doe ([email protected])', value: '8100'},
];
Ключ соответствия и отображения — name
:
$('input').typeahead(
{
minLength: 1,
highlight: true
},
{
name: 'users',
displayKey: 'name',
source: new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: users
})
}
);
Он совпадает при поиске по имени пользователя, например. «Джон» или «Джейн». Но нет, если вы ищете по электронной почте, например. «john.doe», «test» или «email.org».
Однако, если скобки удалены, например. 'John Doe [email protected]'
, то "john.doe" действительно совпадает. Но не "email.org".
Другие специальные символы, такие как <
, например. У 'John Doe <[email protected]>'
та же проблема.
Почему специальные символы нарушают сопоставление данных и что я могу сделать, чтобы помочь?
Вот рабочая ручка.
У меня может быть дополнительный атрибут:
let users = [
{name: 'John Doe ([email protected])', value: '3421', match: 'John Doe [email protected]'},
{name: 'Jane Doe ([email protected])', value: '8100', match: 'Jane Doe [email protected]'},
];
И сопоставить по новому ключу:
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('match')
Или у меня может быть новое свойство email
и следующий токенизатор данных:
datumTokenizer: u => Bloodhound.tokenizers.whitespace([u.name + ' ' + u.email])
Но это далеко не идеал. Но как я могу просто сделать так, чтобы ключ name
совпадал?