2015-10-12 10 views
7

Ich habe ein bisschen mit ES6 und eckigen gespielt und ich verwende eslint-plugin-angular, um mein Javascript zu validieren. Ich habe den folgenden Service:Eslint Warnung Interpretation

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

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

Aber eslint gibt mir die folgende Fehlermeldung:

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

Ich meine ich die Warnung zu verstehen, aber ich habe noch nie in meinem vorherigen Winkel Projekte gemacht, sollte ich Haben Sie getan, was der Fehler vorschlägt? Warum ist es notwendig/gute Praxis?

Die Dokumentation für eslint-plugin-angular Referenz John Papa's angular styleguide, aber ich habe nicht wirklich eine Erwähnung dieser Situation dort gefunden.

Antwort

8

Nicht nur der johnpapa styleguide erwähnt diese Situation nicht, es enthält auch ein Beispiel der Ignorierung der Rückkehr von $rootScope.$on. Allerdings verdeutlicht die Diskussion über one of the eslint-plugin-angular issues der Absicht, ein wenig:

If a controller is registering a listener on $rootScope it should probably be manually destroyed in " $destroy " since root scope will outlive all the controllers. -- davidmason

, die auch indirekt Post verweist auf die von the AngularJS documentation best practice „Richtlinien sollten nach sich aufzuräumen“.

Also unterste Zeile: Ein reguläres $scope Objekt wird schließlich zerstört, wenn sein Controller dies tut, und seine Event-Listener mitnehmen (vorausgesetzt, Sie haben keine Art von Zirkelreferenzierung durchgeführt, die es im Umfang hält). $rootScope stirbt niemals und gibt daher seine Ereignisbehandlungsroutinen nie frei. Wenn Ihr Controller einen Ereignis-Listener zu $rootScope hinzufügt, sollte er diesen Handler im $destroy-Handler Ihres Controllers entfernen.

+0

Danke für die Erklärung, das macht Sinn! – DeX3