假设我有一个控制器用于呈现为ng-view
的页面。
此控制器绑定到外部源(例如应用程序范围的消息总线)的某些事件以更新其模型。这基本上非常简单:
function MyController ($scope) {
$scope.bar = '…';
externalSource.on('foo', function (data) {
$scope.$apply(function () {
$scope.bar = data.bar;
});
});
}
问题是:如果控制器与其关联的视图不再显示,如何从外部源取消绑定控制器?
是否存在诸如dispose
事件之类的东西?
或者我的方法完全错了,我应该以其他方式处理类似的事情?如果是这样,怎么样?
答案 0 :(得分:35)
要在控制器的范围被破坏时执行事件解除绑定,请使用:
$scope.$on('$destroy', function () { /* Unbind code here */ });
有关详细信息,请参阅Scope文档
答案 1 :(得分: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 ....
});