Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在$rootScope上运行$apply与在任何其他作用域上运行$apply_Angularjs_Angularjs Scope - Fatal编程技术网

Angularjs 在$rootScope上运行$apply与在任何其他作用域上运行$apply

Angularjs 在$rootScope上运行$apply与在任何其他作用域上运行$apply,angularjs,angularjs-scope,Angularjs,Angularjs Scope,$apply函数可以在任何作用域上运行,包括$rootScope 在某些情况下,如果在本地作用域上运行它,或者在$rootScope上运行它,是否会产生影响 我这样问是因为我想创建一个helper函数,它将给定函数包装在$apply中。要做到这一点,我总是需要传入一个范围,这是a)恼人的,B)不容易,因为我不一定有本地范围 我希望始终在$rootScope上调用我的helper函数$apply,但如果这样做存在一定风险,则不会这样做。在任何给定范围上运行$digest/$apply将使用深度优先

$apply
函数可以在任何作用域上运行,包括
$rootScope

在某些情况下,如果在本地作用域上运行它,或者在
$rootScope
上运行它,是否会产生影响

我这样问是因为我想创建一个helper函数,它将给定函数包装在
$apply
中。要做到这一点,我总是需要传入一个范围,这是a)恼人的,B)不容易,因为我不一定有本地范围


我希望始终在
$rootScope
上调用我的helper函数
$apply
,但如果这样做存在一定风险,则不会这样做。

在任何给定范围上运行$digest/$apply将使用深度优先遍历访问所有其他范围:


这意味着唯一的区别是$digest将从调用它的任何$scope开始

在任何作用域上运行
$apply
,总是导致
$rootscope.$digest
。唯一可能产生影响的情况是,将表达式作为参数提供给
$apply
。表达式将在当前作用域中求值(与$rootScope相比),但之后将始终调用
$rootScope.$digest

源代码非常清楚:

底线:
如果您在没有参数的情况下调用
$apply
,这没有什么区别。

$rootScope
上运行
$apply
而不是
$scope
的另一个原因通常是当我需要在一个服务中调用
$apply
,该服务将由不同的控制器使用,因此作用域也不同。
在这种情况下,我更愿意将
$rootScope
注入到服务中,并对其调用$apply,而不必担心服务将来将使用哪些作用域。

/*使用$apply*会发生什么情况*/
角度.module('myApp',[]).controller('MessageController',function($scope){
$scope.getMessage=函数(){
setTimeout(函数(){
$scope.$apply(函数(){
//将此包装在$apply内
$scope.message='3秒后获取';
log('message:'+$scope.message);
});
}, 2000);
}
$scope.getMessage();
});

延迟消息:{{Message}}

起初认为这听起来很糟糕,但搜索一点,似乎在任何作用域上调用$apply都会导致$rootScope。无论如何,$digest都会运行,所以我不相信您会遭受任何性能损失,但值得测试的是,在$rootScope上总会调用一些$digest。我在回答中解释了这一点。如果在没有参数的apply之前的代码抛出异常,则会产生不同。angular的错误处理没有捕获到该异常。您是说
thisThrowsAnError()之间存在差异吗$作用域。$apply()
thisThrowsAnError()$rootScope.$apply()
?我正在引用$anyScope.$apply(函数(){/*抛出错误*/})vs/*thorws error*/$anyScope.$apply()。后者是不经过angularBest practice的错误处理程序:使用
$timeout
而不是
$rootScope.$apply()
,以避免难以调试的错误“摘要已在进行中”这一要点。。事实上,将作用域传递给服务应该是一种有文档记录的反模式