Javascript 为什么我需要$rootScope.$在$rootScope.$on内时应用?
为什么在本例中需要Javascript 为什么我需要$rootScope.$在$rootScope.$on内时应用?,javascript,angularjs,Javascript,Angularjs,为什么在本例中需要$rootScope.$apply()使用页面上的ng hide更新元素 根据我的经验,每当我将$scope.$apply()放入$scope.$watch.中时,就会出现“摘要已在进行中”错误。这有什么不同吗 app.component('myComponent', { controller: function(){ $scope.visible = false; $rootScope.$on('someEvent', functio
$rootScope.$apply()
使用页面上的ng hide
更新元素
根据我的经验,每当我将$scope.$apply()
放入$scope.$watch.
中时,就会出现“摘要已在进行中”错误。这有什么不同吗
app.component('myComponent', {
controller: function(){
$scope.visible = false;
$rootScope.$on('someEvent', function(){
$scope.visible = true;
$rootScope.$apply(); // why?
});
}
});
我可以想象,
$scope.$apply
是必要的,如果您想支持来自AngularJS世界之外的事件。查看并考虑如何支持AngularJS(NG点击)和jQuery(OnCutter)的事件。
angular.module('app',[])
.controller('ctrl',函数($scope){
$scope.click=function(){
$scope.$emit('内部'{
信息:“来自AngularJS世界”
})
}
})
.directive('eventListener',function(){
返回{
限制:'E',
控制器:功能($scope){
$scope.message='正在侦听'
//在AngularJS上下文中-$apply将抛出$digest已经运行的错误!
$scope.$on('inside',函数(事件,参数){
$scope.message=args.message
})
//让AngularJS知道有些事情会改变
$scope.$on('外部',函数(事件,参数){
$scope.$apply(函数(){
$scope.message=args.message
})//这相当于:
/*
$scope.message=args.message
$scope.$apply()
*/
})
},
模板:“消息:{{message}}”
}
})
.directive('jQueryClick',function(){
返回{
限制:'E',
链接:功能(范围、元素){
$(元素)。在('单击',函数()上){
范围$emit('外部'{
信息:“外部AngularJS”
})
})
},
模板:“jQuery-onClick()!”,
}
})
AngularJS ng点击!
使用$rootScope注册的回调。
上的$on由或触发。如果您浏览这些方法的源代码,您将看到这些方法本身不会触发循环(脏检查)。这意味着,$digest
应该由调用$broadcast
或$emit
的代码触发,或者在注册了$rootScope.$on
的回调中触发
通常,最好假设回调是在$digest
循环内触发的,这意味着回调调用应该用$apply
包装,如下所示:
$rootScope.$apply($rootScope.$broadcast('event', data));
这与angular的最佳实践是一致的:
$scope.$apply()应尽可能靠近异步事件绑定
可能
没有任何迹象表明这是必要的。提供一个我们无法猜测您的情况的示例$rootScope.$apply()当您想要手动运行摘要循环时需要,因此,如果在修改角度变量的角度上下文之外发生任何事情,您必须手动启动摘要循环。一旦摘要循环运行并尝试应用,它将给出该错误。我认为在这种情况下不需要该错误<代码>$scope.上的$on已经在调用摘要循环,因此函数中的每个更改都将被更新。