8

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

4

3 回答 3

9

不,没有任何方法可以在没有某种访问权限的情况下收听 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"这将防止您所说 的任何问题。

于 2013-10-27T21:55:23.287 回答
6

如果您只监听事件,则不必使用$rootScope; 例如$scope.$on("$routeChangeError"),在指令的范围内,从控制器或链接功能。

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

于 2013-10-27T21:50:19.030 回答
5

$on方法是在 internal 上定义的Scope.prototype,并且由于 Angular 中的每个作用域都是从Scope构造函数创建的,这意味着每个作用域$on本身都有一个可用的方法。不需要注入$rootScope,直接调用$on指令链接函数作用域上的方法即可:

app.directive('myDirective', function(){
  return function(scope, element, attrs){
    scope.$on('$routeChangeError', function(){
      // ...
    });
  }
});
于 2013-10-27T21:57:29.277 回答