【问题标题】:bootstrap typeahead not populating with response from promise引导输入未填充来自承诺的响应
【发布时间】:2017-11-22 05:01:44
【问题描述】:

我的引导输入如下:

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

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

$scope.getSuggestions = viewValue => {

    let deferred = $q.defer();

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

    return deferred.promise;

};

注意:当 getSuggestions() 返回一个数组而不使用任何承诺时,预输入工作正常。

【问题讨论】:

  • $scope.getSuggestions 返回一个 Promise,对……所以,它不会返回一个您可以使用的数组
  • @JaromandaX 预输入与 Promise 配合得很好。我可以这么说是因为预输入弹出窗口有时会出现,虽然很少。

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


【解决方案1】:

在 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;

};

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多