自从我发布这个问题以来已经有一段时间了,但是考虑到似乎仍然可以得到的意见,这是最近几个月来我想到的另一种解决方案:
$scope.safeApply = function( fn ) {
var phase = this.$root.$$phase;
if(phase == '$apply' || phase == '$digest') {
if(fn) {
fn();
}
} else {
this.$apply(fn);
}
};
上面的代码基本上创建了一个名为safeApply
的$apply
函数,如果只有Angular当前没有经过该$digest
阶段,则调用该函数(如Arun的回答所述)。另一方面,如果Angular 当前正在消化事物,它将按原样执行该函数,因为这足以向Angular发出信号以进行更改。
$apply
AngularJs当前处于使用$digest
阶段时,尝试使用该函数时会发生许多错误。safeApply
上面的代码是防止此类错误的安全包装。
(注:我个人比较喜欢到卡盘safeApply
之间的函数关系$rootScope
为方便起见)
例:
function change() {
alert("a");
var scope = angular.element($("#outer")).scope();
scope.safeApply(function(){
scope.msg = 'Superhero';
})
}
演示:http://jsfiddle.net/sXkjc/227/
.scope()
要求启用调试数据,但出于速度原因,不建议在生产中使用调试数据。以下解决方案似乎围绕着scope()