承诺MagicSuggest数据功能

时间:2017-02-13 10:28:03

标签: javascript jquery ajax magicsuggest

我试过直接在github上问这个问题但是这个项目似乎没有多少动静了。如果SO上有人有想法,那就太好了。是否可以在数据函数中返回一个promise?我试过以下它似乎没有用。问题是我试图在数据函数中进行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 个答案:

答案 0 :(得分:0)

对于那些感兴趣的人,我设法找到问题的解决方案。在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调用,因此您可能希望通过添加某种延迟来改善这种情况。

答案 1 :(得分:0)

我也是这样做的:

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[]>