Я использую typeahead. js с Bloodhound для поиска пользователей с использованием локального источника:
let users = [
{name: 'John Doe (john.doe@email.org)', value: '3421'},
{name: 'Jane Doe (test@email.org)', 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
})
}
);
It совпадает при поиске по имени пользователя, например, «Джон» или «Джейн». Но не при поиске по электронной почте, например, "john.doe", "test" или "email.org".
Однако, если скобки удалены, например, 'John Doe john.doe@email.org'
, тогда "john.doe" матч. Однако не "email.org".
Другие специальные символы, такие как <
, например, 'John Doe <john.doe@email.org>'
, имеют ту же проблему.
Почему специальные символы нарушают сопоставление данных и что я могу сделать
Вот это рабочая ручка .
. У меня может быть дополнительный атрибут:
let users = [
{name: 'John Doe (john.doe@email.org)', value: '3421', match: 'John Doe john.doe@email.org'},
{name: 'Jane Doe (test@email.org)', value: '8100', match: 'Jane Doe test@email.org'},
];
И совпадение по новому ключу. :
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('match')
Или у меня может быть новое свойство email
и следующий токенайзер базовых данных:
datumTokenizer: u => Bloodhound.tokenizers.whitespace([u.name + ' ' + u.email])
Но это далеко от идеала. Но как я могу просто сопоставить ключ name
?