2013-03-17 46 views
18

假設我有一個正在渲染爲ng-view的頁面的控制器。

該控制器綁定到外部源的某些事件(例如應用程序範圍的消息總線)以更新其模型。基本上,這工作很容易:

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

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

的問題是:如何從曾經認爲它是有沒有再顯示相關的外部源解除綁定控制器?

是否有某事如dispose事件或類似的東西?

或者是我的方法完全錯誤,我應該以某種方式處理類似的事情?如果是這樣,怎麼樣?

+0

如果您在('event',...)**方法上使用jQuerys **,只需簡單地調用** off('event')**即可刪除該事件。還是我誤解了你? – 2013-03-17 11:59:47

+0

這不是一個特別的問題。它取決於您正在使用的外部事件資源。 – 2013-03-17 12:01:55

+3

是的。我知道如何解除綁定,但我不知道何時/在哪裏做。這取決於控制器的生命週期,這當然與AngularJS有關。 – 2013-03-17 13:02:30

回答

35

要執行解除綁定的事件時,控制器的範圍得到了銷燬使用:

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

請參閱Scope docs for more info

+2

我想你的意思是'$ scope。$ on('$ destroy',function(){...})' – 2013-03-18 15:56:10

+0

@Mark Rajcok的確,謝謝 – 2013-03-18 17:08:53

3

使用$ routeChangeStart或$ 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 .... 
    }); 
} 

...或$destroy事件:

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