Обещание в функции данных MagicSuggest
Я пытался задать этот вопрос непосредственно на github, но в этом проекте, похоже, больше нет движения. Было бы здорово, если у кого-то на SO есть идея. Можно ли вернуть обещание в функции данных? Я пробовал следующее, и это не похоже на работу. Проблема в том, что я пытаюсь сделать ajax-вызов внутри функции данных, которая ожидает массив результатов / данных. Конечно, я не могу сделать это при выполнении асинхронного вызова AJAX.
var ms = $('#mycombo').magicSuggest({minChars: 2, data : function(q) {
return someAPI.findSuggestions(q, currentLang).then(function(response) {
if(!_.isEmpty(response.data.suggestions)) {
_.each(response.data.suggestions, function(suggestion) {
if (suggestion.id && suggestion.label) {
data.push({ id: suggestion.id, name: suggestion.label });
}
});
}
});
return data;
}});
Если есть альтернативный способ решения этой проблемы, я был бы очень признателен за вашу помощь.
Заранее спасибо.
Майкл
2 ответа
Для тех, кому интересно, мне удалось найти решение проблемы. Как написано на github ( https://github.com/nicolasbize/magicsuggest/issues/281), вам нужно использовать событие keyup вместо установки свойства data во время инициализации. Так что теперь это выглядит примерно так:
var ms = $('#mycombo').magicSuggest({minChars: 2});
$(ms).on('keyup', function(e, m, v) {
// ... get data via ajax and call "ms.setData(data)" in the response callback ...
// ... you can use m.getRawValue() to get the current word being typed ...
ms.setData(data);
}
Это приведет к тому, что вызов ajax будет срабатывать после каждого нажатия клавиши, поэтому вы можете улучшить это, добавив некоторую задержку или что-то в этом роде.
Я также сделал это так:
const suggester: any = divElem.magicSuggest({
...more properties here...
data: (query) => {
if (query) {
this.myService.mySearch(query).take(1).subscribe((list) => {
suggester.setData(list);
});
}
return [];
},
...more properties here...
});
Где mySearch(запрос) возвращает:
Observable<MyObject[]>