Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
Javascript 为什么我需要$rootScope.$在$rootScope.$on内时应用?_Javascript_Angularjs - Fatal编程技术网

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已经在调用摘要循环,因此函数中的每个更改都将被更新。