No AngularJS, cada ouvinte em qualquer $ scope deve ser destruído manualmente. Para fazer isso, quando você cria um ouvinte, ele retorna uma função para destruí-lo.
destroyCallback = $rootScope.$on 'my:event', ->
console.log 'my code'
Assim, você pode destruí-lo quando o $ scope atual destruir
$scope.$on '$destroy', ->
# unbind listener 'my:event'
destroyCallback()