我想知道你是否有一个指令代码的例子,它对角度事件做出反应,比如$routeChangeError
不注入$rootScope
它($on
在链接函数中使用)。在我看来,它打破了 MV* 模式并“产生”了气味代码(提供了在指令中操纵根范围的可能性)。提前致谢。
3 回答
不,没有任何方法可以在没有某种访问权限的情况下收听 Angular 事件$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
});
}
};
});
您的scope
变量是一个“隔离”范围,因此它不会以任何方式影响其父范围。但是,如果您尝试将事件发送到某个姐妹级模块,这确实会产生一些奇怪的副作用,因为 Angular 事件只能通过作用域层次结构$emit
向上或向下。$broadcast
如果您不是,那么上面的示例应该可以完美运行。如果您是,那么以下示例是一种方法:
.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
以便您对其进行的任何更改都不会影响其他模块或服务。"smell-code"
这将防止您所说 的任何问题。
如果您只监听事件,则不必使用$rootScope
; 例如$scope.$on("$routeChangeError")
,在指令的范围内,从控制器或链接功能。
您会看到"$routeChangeError"
是从 广播的$rootScope
,因此所有孩子都会收到它。
$on
方法是在 internal 上定义的Scope.prototype
,并且由于 Angular 中的每个作用域都是从Scope
构造函数创建的,这意味着每个作用域$on
本身都有一个可用的方法。不需要注入$rootScope
,直接调用$on
指令链接函数作用域上的方法即可:
app.directive('myDirective', function(){
return function(scope, element, attrs){
scope.$on('$routeChangeError', function(){
// ...
});
}
});