2016-11-04 9 views
2

こんにちは私はパフォーマンス面で何が良いのだろうかと思っています。 のは、私がものを放送するこの工場があるとしましょう:そのイベントをリッスン

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

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

     } 
    ] 
); 

をどこかの成分(またはそれらの多くを)持っています。何が良いでしょうか?

$ rootScopeを使用するには$上:。。

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

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

    }] 
}); 

または$の範囲$上:

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

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

    }] 
}); 

の両方が働くだろう、私は興味があります。

答えて

6

私はここの人々がなぜパフォーマンスに執着しているように見えるのか分かりません。パフォーマンスに問題がある場合は、パフォーマンスについてのみ心配する必要があります。さもなければ、それはすべての悪の根源である時期尚早の最適化です。

この場合、悪意のあるメモリリーク、多くのパフォーマンスの問題があります。

コントローラには、コントローラと同じライフサイクルを持つスコープがあります。一方、$ rootScopeはシングルトンです。

したがって、ルートスコープにリスナーを追加し、それが不要になったときにリスナーを削除するのを忘れた場合、メモリリークが発生します。スコープへの暗黙的な参照を持つコントローラーへの暗黙的な参照を持つリスナーは、生きていてメモリを消費し、何の理由もなくイベントに反応し続けます。

コントローラのスコープにリスナーを追加すると、スコープとコントローラが破棄されると、誰もリスナーへの参照を失い、すべてがガベージコレクションされます。

したがって、まず、単純さ、保守性、テスト容易性、および正確さのために努力してください。パフォーマンスはあなたの主要な関心事ではありません。フレームワークは、フレームワークを使用する自然で文書化されたすべての方法が十分に速いことを確認します。

関連する問題