Javascript AngularJS 1.5组件中的第三方异步回调

Javascript AngularJS 1.5组件中的第三方异步回调,javascript,angularjs,angularjs-1.5,Javascript,Angularjs,Angularjs 1.5,在AngularJS 1.5之前,在指令或视图中,当从第三方异步回调发出更改时,确保angular(使用$digest cycle)能够获取更改的方法是在$scope.$apply()调用中运行代码 就我所知,使用组件的想法是摆脱$scope,只需将模板绑定到组件的控制器。我正试图过渡到编写组件而不是视图,而不依赖$scope。假设我有以下代码: function CompController(TPApi) { let self = this; this.endCallback

在AngularJS 1.5之前,在指令或视图中,当从第三方异步回调发出更改时,确保angular(使用$digest cycle)能够获取更改的方法是在
$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>'
})
功能控制器(TPApi){
让自我=这个;
this.endCallback=false;
TPApi.call(数据,()=>this.endCallback=true);
}
角度.module('app',[]).component('myComp'{
控制器:控制器,
模板:“已调用回调”
})
这里的问题是,
ng show
是双重绑定到控制器的,但是没有为回调使用$scope.$apply(),因为$digest循环不会被触发,所以ng show不会获取更改。这是一个非常麻烦的问题,因为我必须在控制器中注入$scope并调用$apply,但这首先违背了依赖$scope的目的

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


有没有一种聪明的方法可以在不触发$digest的情况下实现这一点,或者angular 1只是因为$scope和$digest而存在固有的缺陷?

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


你能用小提琴再现这种行为吗?您的示例运行正常,模型在api调用后更新。这里是:Used geolocation。如果您使用了$q或$http之类的角度服务,它会工作,但这是因为它们用$apply包装回调。这就是我想要避免的。不幸的是,我对es6知之甚少。那么就学习它吧,它很简单!
function CompController(TPApi) {
    let self = this;
    this.endCallback = false;
    TPApi.call(data, () => $timeout(() => this.endCallback = true, 0));
}