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来检测路由更改错误并将其显示给用户)?实际上,这段视频是我提问的导火索。