Enquanto esta implementação não se torna a padrão do AngularJS, segue abaixo o código a ser usado para ter um $apply seguro para ser usado em qualquer parte do código.
$scope.safeApply = function(fn) {
var phase = this.$root.$$phase;
if( phase == '$apply' || phase == '$digest' ){
if( fn && ( typeof( fn ) == 'function' ) ){
fn();
}
} else {
this.$apply( fn );
}
};




