Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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的情况下对指令中的角度事件作出反应_Javascript_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 在不注入$rootScope的情况下对指令中的角度事件作出反应

Javascript 在不注入$rootScope的情况下对指令中的角度事件作出反应,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我想知道您是否有一个指令代码的示例,它对角度事件(如$routeChangeError)作出反应,而不向其中注入$rootScope(在链接函数中使用$on)。在我看来,它打破了MV*模式并“产生”了气味代码(提供了在指令中操纵根范围的可能性)。提前感谢。如果您只收听事件,则不必使用$rootScope;例如,从控制器或链接功能对指令的作用域执行(“$routeChangeError”) 您可以看到,“$routeChangeError”是从$rootScope广播的,因此所有的孩子都会收到它。

我想知道您是否有一个指令代码的示例,它对角度事件(如
$routeChangeError
)作出反应,而不向其中注入
$rootScope
(在链接函数中使用
$on
)。在我看来,它打破了MV*模式并“产生”了气味代码(提供了在指令中操纵根范围的可能性)。提前感谢。

如果您只收听事件,则不必使用
$rootScope
;例如,从控制器或链接功能对指令的作用域执行(“$routeChangeError”)


您可以看到,
“$routeChangeError”
是从
$rootScope
广播的,因此所有的孩子都会收到它。

否。如果没有对
$scope
的某种访问权,就无法收听角度事件。这是他们拥有
$rootScope
服务的主要原因之一,因此您可以在服务或其他模块中访问
$scope

但是,在指令中,您不需要注入
$rootScope
,因为在链接函数的指令中已经有一个隔离作用域

例如:

.directive('myDirective', function(){
    return {
        restrict: 'A',
        link: function(scope, elem, attrs){
            scope.$on('some-event', function(e){
                // respond to event here
            });
        }
    };
});
您的
范围
变量是一个“隔离”范围,因此它不会以任何方式影响其父范围。但是,如果您试图将事件发送到某个姐妹级模块,这确实会产生一些奇怪的副作用,因为角度事件只能通过作用域层次结构向上或向下
$emit
。如果您不是,那么上面的示例应该可以完美地工作。如果是,则以下示例是一种方法:

.directive('myDirective', function($rootScope){
    var isolateScope = $rootScope.new();  // creates a new isolate copy of $rootScope
    return {
        restrict: 'A',
        link: function(scope, elem, attrs){
            isolateScope.$on('some-event', function(e){
                // respond to event here
            });
        }
    };
});

这将创建一个类似的
$rootScope
隔离副本,这样您对它所做的任何更改都不会影响其他模块或服务。这将防止您所称的“气味代码”出现任何问题

$on
方法是在内部
作用域上定义的。原型
,由于Angular中的每个作用域都是从
作用域
构造函数创建的,这意味着每个作用域本身都有一个可用的
$on
方法。无需注入
$rootScope
,只需直接调用指令链接函数作用域上的
$on
方法即可:

app.directive('myDirective',function(){
返回函数(范围、元素、属性){
作用域.$on(“$routeChangeError”,函数(){
// ...
});
}
});

这是否意味着John Lindquist在其教程中展示的解决方案设计得很糟糕(在指令中使用AngularJS$rootScope来检测路由更改错误并将其显示给用户)?实际上,这段视频是我提问的导火索。