当我开始阅读$ digest和$ apply时,我清楚地理解了这两者。
但是当我开始探索$ apply
时,我歪曲了下面的代码$scope.$apply(function(){
$scope.isLoggedIn = true;
});
在$ scope中传递函数参数的需要是什么。$ apply功能。?任何方式$ scope。$ apply将调用$ rootscope。$ digest它将触发所有观察者并且值将更新到视图。那么为什么我们在$ apply函数中传递函数参数。
答案 0 :(得分:0)
假设您已经知道when to use $scope.$apply
,请查看$apply
docs中的伪代码:
function $apply(expr) {
try {
return $eval(expr);
} catch (e) {
$exceptionHandler(e);
} finally {
$root.$digest();
}
}
如果您将功能传递给$apply
,则会将其转发至$eval
。
eval的文档显示我们可以传递字符串或函数。
- 中定义的规则执行
string
:使用expression。function(scope)
:使用当前范围参数执行该函数。
在您的情况下,您正在传递一个功能。简单地使用当前范围作为第一个参数来评估该函数。
$scope.$apply(function(scope) {
scope === $scope;
});
因此,简而言之:可以使用函数参数调用$apply
,该函数参数将在范围摘要开始之前进行安全评估。
答案 1 :(得分:0)
听起来你在问我们何时想要使用$scope.$apply
。在Angular之外集成值时,这一点至关重要。例如:
$scope.$apply(function(scope) {
var aValue = 'shemp';
$scope.valueOnScope = aValue;
});
现在,框架可以添加一个完全不属于AngularJs的aValue。您可以使用游戏库中的值(如 phaser )或可视化库(如 D3 )来执行此操作,但通常会使用常量,因为$ apply只会更新值曾经,除非你故意把它放在某种循环中,或者更常见的是,它是一个事件处理程序。
$ apply可以成为强制完整的$ digest运行的好工具,并且您会发现许多开发人员为此目的使用它。如果你希望AngularJs在框架外更新一个值,那么你最好在它上面加一个$ watch,然后是$ apply。
$ apply确实会在你的角度程序中运行所有观察者的$ digest,所以为了优化你的代码,你可能需要谨慎使用$ apply。
答案 2 :(得分:-1)
你展示的代码很奇怪。这没有任何意义,因为$ digest将在没有$ scope的情况下被调用。$ apply。
$ scope。如果你正在做一些Angular以外的事情,应该调用$ apply。