bootstrap typeahead没有填充promise的响应

时间:2017-11-22 05:01:44

标签: javascript twitter-bootstrap promise typeahead bootstrap-typeahead

我的bootstrap typeahead如下:

<input id="inputId" type="text" ng-model="selected" typeahead="name for name in getSuggestions($viewValue) " typeahead-on-select="typeaheadOnSelect($item)" ng-trim="false">

getSuggestions()返回一个promise,如下所示:

$scope.getSuggestions = viewValue => {

    let deferred = $q.defer();

    getSuggestions(viewValue).then(words => {
        deferred.resolve(words); // array of strings
    })
    .catch(()=>{
        deferred.reject([]);
    });

    return deferred.promise;

};

注意:当getSuggestions()返回一个不使用任何promise的数组时,typeahead工作正常。

1 个答案:

答案 0 :(得分:0)

在AngularJS中,resolve()的结果在$ digest周期内异步传播,而不是立即传播。这意味着只有在摘要周期发生时才会调用(稍后)调用then()注册的回调。

因此,调用 $ digest()或者如果需要,$ apply()是导致摘要周期运行的一种方法。

因此需要将给定代码更新为以下内容:

$scope.getSuggestions = viewValue => {

    let deferred = $q.defer();

    getSuggestions(viewValue).then(words => {
        deferred.resolve(words); 
        $scope.$digest();//this triggers the digest cycle 
    })
    .catch(()=>{
        deferred.reject([]);
    });

    return deferred.promise;

};