我正在读http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/
指令链接函数:
element.bind('click', function() {
scope.foo++;
scope.bar++;
scope.$apply();
});
使用$apply的更好方法:
element.bind('click', function() {
scope.$apply(function(){
scope.foo++;
scope.bar++;
});
});
有什么关系呢?不同的是,在第一个版本中,我们在angular上下文之外更新值,因此如果抛出错误,Angular将永远不会知道。显然,在这个小小的玩具示例中,它不会有太大的不同,但想象一下,我们有一个向用户显示错误的警告框,我们有一个执行网络调用的第三方库,但它失败了。如果我们不把它包装在$apply中,Angular将永远不会知道失败,警告框也不会出现在那里。
困惑:为什么angular需要知道错误,我只需要向用户展示它。例如,在指令的链接fn中有一个ajax请求,我只需要告诉如果失败会发生什么。
发布于 2015-12-18 15:14:28
TAngular $scope有一个名为$apply()的函数,它接受一个函数作为参数。AngularJS表示,只有在$apply()中进行模型突变时,它才会知道模型突变。因此,您只需要将更改模型的代码放在一个函数中,并调用$scope.apply(),将该函数作为参数传递。在$apply()函数调用结束后,AngularJS知道可能已经发生了一些模型更改。然后,它通过调用另一个函数$rootScope.$digest()启动一个摘要周期,该函数传播到所有子作用域。在摘要周期中,会调用观察者来检查模型值是否已更改。如果值已更改,则会调用相应的侦听器函数。现在,它取决于监听器如何处理模型更改。
通过Angular buildin $http模型突变代码的Ajax调用被隐式地包装在$apply()调用中,因此您不需要任何额外的步骤。
https://stackoverflow.com/questions/34350047
复制相似问题