我试图找出角度基准是否自动解除绑定观察者和与之绑定的作用域事件,$scope.$on(...)或者 销毁*$scope.$watch(...)作用域? *
$scope.$on(...)
$scope.$watch(...)
假设我有以下代码:
$scope.$on('someEvents', handleSomeEvent); $scope.$watch('someProperty', handleSomePropertyChange);
在范围上触发$ destroy事件时,是否需要手动取消绑定这些观察程序和事件?
根据Angular文档$scope:
$scope
当希望将作用域及其子作用域与父作用域永久分离时,必须在作用域上调用’$ destroy()’,从而通过调用停止参与模型更改检测和侦听器通知。
也
删除还意味着当前范围可以进行垃圾回收。
如此看来,当$destroy()调用时,所有观察者和侦听器都将被删除,并且表示作用域的对象变为eligible for garbage collection。
$destroy()
eligible for garbage collection
如果我们查看destroy() 源代码,将会看到一行:
destroy()
forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));
应该删除所有侦听器。
如@glepretre所述,它适用于控制器中的观察者和侦听器。上面列出的同一文档页面指出:
请注意,在AngularJS中,还有一个$ destroy jQuery事件,该事件可用于在从DOM中删除元素之前清除DOM绑定。
因此,如果指令中有特定的侦听器,则应侦听$destroy事件并自己进行必要的清理
$destroy