javascript - 将 Angular promise 绑定(bind)到 $scope 更改失败

标签 javascript angularjs

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

我正常设置了指令:

<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 ,但因为我想用属于该 Controller $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 总是返回一个空数组。该 promise 不会使用 token.ids.tags 服务的新值进行更新。

编辑:Plunkr demonstrating problem

也就是说,如果您将 $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>

关于javascript - 将 Angular promise 绑定(bind)到 $scope 更改失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952040/

相关文章:

javascript - 从 Angular 对象数组中获取特定对象

javascript - getAttribute 在 ElementHandle 上不可用

javascript - 如果使用 mouseout,则指令模板中的 AngularJS 事件绑定(bind)不起作用,但可以使用 mouseover

php - Angular 聊天室 Web 应用程序

javascript - 通过GET请求只拉取对象的某些部分

javascript - 如何将范围值传递给指令 Controller

javascript - 如何更正 webjars 的包含路径?

javascript - 更改谷歌地图Javascript上的标记

javascript - 如何使两个或多个 html 元素在可编辑区域中表现为一个单元

angularjs - 以 Angular 重定向 url(例如 website.com/username)