失败绑定 Angular 承诺$scope变化

Failure binding Angular promise to $scope change

本文关键字:scope 变化 承诺 绑定 Angular 失败      更新时间:2023-09-26

在使用ngTagsInput时,我在绑定<autocomplete source='fnPromise()'>的承诺时遇到问题。我不认为ngTagsInput有什么问题;我认为我对范围和承诺的理解不够充分,无法理解如何做我想做的事情。

我正常设置指令:

<tags-input ng-model="token.ids.tags"
            class="form-field no-animate tag-input"
            placeholder="Delete unwanted IDs"
            addFromAutocompleteOnly="true">
    <auto-complete source="offerTags($query)"></auto-complete>
</tags-input>

问题出在 offerTags() 函数上。这将返回一个 promise,但由于我想用该控制器$scope的一部分数组填充自动完成功能,所以我告诉 promise 只返回该$scope属性:

$scope.offerTags=function(query) {
    var deferred=$q.defer();
    var tags=$scope.token.ids.tags;
    deferred.resolve( tags);
    return deferred.promise;
}

但是,$scope.token.ids.tags 仅在服务返回后(页面加载后)填充。所以发生的情况是offerTags总是返回一个空数组。承诺不会使用 token.ids.tags 服务的新值进行更新。

编辑:Plunkr演示问题

即,如果将 $scope.token.ids.tags 替换为静态数组,则自动完成功能有效,但仅该静态数组的内容有效。

对不起,冗长的解释...知道我怎样才能让它工作吗?

您的服务应如下所示:

app.factory('TokenService', function ($http) {
    return {
        loadTags: function (query) {
          return $http.get('/query', {
            params: {
             q: query
            }
          }).then(function(res){
            return res.data;
          });
        }
    }
});

把它放在示波器上:

$scope.loadTags = TokenService.loadTags;

和模板:

<tags-input ng-model="tags">
  <auto-complete source="loadTags($query)"></auto-complete>
</tags-input>