safeApply para Angular

Avitando el "Error: $digest already in progress"

Algo que odio de angular es como se van del paradigma de programación orientada a eventos, a diferencia de Backbone y otras librerías que se basan en este paradigma, Angular 1.x se maneja con cosas horribles como watchers para actualizar los cambios en una vista si este está fuera del contexto del scope.

El problema por ejemplo, es si usamos una librería aparte que según emita eventos deberemos actualizar una vista o disparar un método de un controller.

Buscando una solución a un problema que tenía me encontré con este post que resuelve este problema, creando una función safeApply.

nuestroModulo.run(['$rootScope', function ($rootScope) {

        $rootScope.safeApply = function(fn) {
            var phase = this.$root.$$phase;
            if(phase === '$apply' || phase === '$digest') {
                if(fn && (typeof(fn) === 'function')) {
                    fn();
                }
            } else {
                this.$apply(fn);
            }
        };

}]);

Al hacerlo en el rootScope podremos acceder a esta desde cualquier controlador.