6

嗨,我想知道在性能方面什么更好。假设我有这个广播东西的工厂:

angular.module('core.foo')
  .factory('Foo',
    ['$rootScope', 
      function FooFactory($rootScope) {

        $rootScope.$broadcast('bar', baz);

      }
    ]
  );

并在某处(或很多)有一个组件监听该事件。什么会更好?

要使用 $rootScope.$on:

angular.module('foo').component('foo', {
  templateUrl: 'foo.html',
  controller: ['$rootScope',
    function FooController($rootScope) {

      $rootScope.$on('bar', function(event, data){
        // use the data
      });

    }]
});

或 $scope.$on:

angular.module('foo').component('foo', {
  templateUrl: 'foo.html',
  controller: ['$scope',
    function FooController($scope) {

      $scope.$on('bar', function(event, data){
        // use the data
      });

    }]
});

两者都可以,我只是好奇。

4

1 回答 1

9

我真的不明白为什么这里的人们似乎对表演如此着迷。当您遇到性能问题时,您应该只担心性能。否则就是过早的优化,是万恶之源。

在这种情况下,邪恶可能是内存泄漏和许多性能问题。

控制器的作用域与控制器具有相同的生命周期。另一方面,$rootScope 是一个单例。

因此,如果您将侦听器添加到根范围,并且在不再需要它时忘记将其删除,那么您将发生内存泄漏。监听器对控制器有一个隐式引用,控制器对其作用域有一个隐式引用,它将保持活动状态,消耗内存,并无缘无故地继续对事件做出反应。

但是,如果您将侦听器添加到控制器的作用域中,那么当作用域和控制器被销毁时,将不再有对该侦听器的引用,并且所有内容都将被垃圾回收。

因此,首先要争取简单性、可维护性、可测试性和正确性。性能不应该是您最关心的问题。该框架确保使用该框架的每一种自然的、记录在案的方式都足够快。

于 2016-11-04T15:44:15.323 回答