4

在 AngularJS 1.5 之前,在指令或视图中,确保在从第三方异步回调发出更改时(使用 $digest 循环)获取更改的方法是在$scope.$apply()调用中运行您的代码。

对于组件,据我了解,其想法是摆脱$scope模板并将模板绑定到组件的控制器。我正在尝试过渡到编写组件而不是视图,而不依赖于 $scope。假设我有以下代码:

function CompController(TPApi) {
    let self = this;
    this.endCallback = false;
    TPApi.call(data, () => this.endCallback = true );
}

angular.module('app',  []).component('myComp', {
    controller: CompController,
    template: '<div><span ng-show="$ctrl.endCallback">Callback Called</span></div>'
})

这里的问题ng-show是双重绑定到控制器,但不使用 $scope.$apply() 进行回调,ng-show 不会拾取更改,因为不会触发 $digest 循环。这非常令人烦恼,因为我必须在控制器中注入 $scope 并调用 $apply,但这首先违背了依赖 $scope 的目的。

我想一种方法是将 TPApi 与$q服务一起封装,从而确保在发出回调时调用 $digest 循环。但是,如果在某个时候我想过渡到使用新的本机PromiseAPI 而不是$q?

有没有一种聪明的方法可以在不触发 $digest 的情况下做到这一点,或者 angular 1 由于 $scope 和 $digest 而存在固有缺陷?

4

1 回答 1

0

由于您正在调用第三方 API,因此您必须让 angular 更新并识别到达的新数据。如果您不想使用 $scope,您可以使用 $timeout 包装您的代码(这会为您触发摘要循环)

function CompController(TPApi) {
    let self = this;
    this.endCallback = false;
    TPApi.call(data, () => $timeout(() => this.endCallback = true, 0));
}
于 2017-01-09T18:21:29.000 回答