7

私はES6とangularで少し遊んでいてeslint-plugin-angular、JavaScriptを検証するために使用しています。次のサービスがあります。

export function runBlock ($rootScope, $state, $log) {
  'ngInject';

  $rootScope.$on( '$stateChangeStart', function(event, toState) {
    // ...
  } );

しかしeslint、次のエラーが表示されます。

The "$on" call should be assigned to a variable, in order to be
destroyed during the $destroy event

私は警告を理解していますが、以前のAngularプロジェクトでこれを行ったことはありません。エラーが示唆することを行うべきでしたか? なぜそれが必要なのか/良い習慣なのか?

John Papa の angular styleguideeslint-plugin-angularを参照するためのドキュメントですが、この状況についての言及は実際には見つかりませんでした。

4

1 に答える 1

8

johnpapa スタイルガイドはこの状況について言及していないだけでなく、実際には の戻り値を無視する例を含んでい$rootScope.$onます。ただし、eslint-plugin-angular の問題の 1 つに関する議論は、意図を少し明確にします。

コントローラーがリスナーを登録している場合、ルート スコープはすべてのコントローラーよりも長く存続するため、$rootScopeおそらく " " で手動で破棄する必要があります。$destroy--デビッドメイソン

その投稿は、AngularJS documentationからの「ディレクティブは自分自身でクリーンアップする必要があります」ベストプラクティスも間接的に参照しています。

要するに、通常の$scopeオブジェクトは、そのコントローラーが破棄されると最終的に破棄され、そのイベント リスナーを使用します (スコープ内に保持するような循環参照を行っていないと仮定します)。$rootScope死ぬことはないので、そのイベント ハンドラーを解放することはありません。コントローラーが にイベント リスナーを追加している場合は$rootScope、コントローラーのハンドラーでそのハンドラーを削除する必要があります$destroy

于 2015-10-12T14:31:39.490 に答える