2013-03-17 2 views
18

Angenommen, ich habe einen Controller für eine Seite, die in eine ng-view gerendert wird.

Dieser Controller verbindet sich mit einigen Ereignissen einer externen Quelle (z. B. einem anwendungsweiten Nachrichtenbus), um sein Modell zu aktualisieren. Dies funktioniert im Grunde sehr einfach:

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 
} 

Das Problem ist: Wie kann ich den Controller aus der externen Quelle lösen, sobald die Ansicht es mit nicht mehr gezeigt verbunden ist?

Gibt es etwas wie ein Ereignis dispose oder etwas ähnliches?

Oder ist meine Herangehensweise völlig falsch, und ich sollte irgendwie mit so etwas umgehen? Wenn das so ist, wie?

+0

Wenn Sie jQuerys ** on ('event', ...) ** Methode verwenden, können Sie einfach ** off ('event') ** aufrufen, um das Ereignis zu entfernen. Oder habe ich dich falsch verstanden? –

+0

Dies ist nicht eine angularjs Frage im Besonderen. Es hängt von der externen Ereignisressource ab, die Sie verwenden. –

+3

Ja ist es. Ich weiß wie man es löst, aber ich weiß nicht wann/wo ich es machen soll. Dies hängt vom Lebenszyklus eines Controllers ab und hängt mit AngularJS zusammen. –

Antwort

35

Ereignis auszuführen entbinden, wenn Umfang des Controllers wurde zerstört Gebrauch:

$scope.$on('$destroy', function() { /* Unbind code here */ });

Siehe Scope docs für weitere Informationen

+2

Ich glaube, du meintest '$ scope. $ On ('$ destroy', function() {...})' –

+0

@Mark Rajcok In der Tat, danke –

3

Verwenden $ routeChangeStart oder Ereignisse $ routeChangeSuccess:

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 

    $scope.$on('$routeChangeStart', function(next, current){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
} 

... oder $destroy Veranstaltung:

$scope.$on('$destroy', function(){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
Verwandte Themen