Pasar el alcance actual a un servicio AngularJS


¿Es correcto pasar el "current" $scope a un servicio AngularJS?

Estoy en la situación en la que tengo un service service sabiendo que solo lo consume un controlador, y me gustaría tener una referencia al alcance del controlador en los propios métodos $service.

¿Es esto filosóficamente correcto?

O mejor que transmita eventos al ro rootScope y luego haga que mi controlador los escuche?

Author: Ahmad Baktash Hayeri, 2013-03-20

4 answers

Para que el controlador sepa cuando ocurre algo asincrónico, use Angular promises.

Para provocar el $apply, no necesita el ámbito, puede llamar a $rootScope.$apply, ya que no hay diferencia en llamarlo en un ámbito específico o en la raíz.

Con respecto a la lectura de la variable, sería mejor si recibiera parámetros. Pero también podría leerlo desde un ámbito como un parámetro de objeto, pero iría con el parámetro, que haría que su interfaz de servicio mucho más clara.

 67
Author: Caio Cunha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-19 20:56:59

Yo diría que si su funcionalidad es específica para un solo controlador, entonces no necesita un servicio.

Las tareas de controllers son manipular el modelo específico mientras que un servicio debe ocuparse de tareas globales. Prefiero apegarme a este paradigma en lugar de mezclar las cosas.

Esto es lo que dicen los documentos

Servicio

Los servicios de Angular son singletons que llevan a cabo tareas específicas comunes a la web aplicaciones

Controlador

En Angular, un controlador es una función JavaScript(tipo/clase) que se utiliza para aumentar las instancias de ámbito angular, excluyendo el ámbito raíz.

PD: Aparte de eso, si necesita digerir, también puede inyectar el ro rootScope dentro de su servicio.

 15
Author: F Lekschas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-19 20:52:56

Sí. Puede pasar el ámbito $al servicio cuando lo inicialice. En el constructor de servicios puede asignar el ámbito a algo como esto._scope y luego haga referencia al alcance dentro del servicio!

angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {

    $scope.someVar = 4;

    $scope.blahService = new blahService($scope);

});

angular.module('blah').factory('blahService', function() {

    //constructor
    function blahService(scope) {
        this._scope = scope;

        this._someFunction()
    }

    //wherever you'd reference the scope
    blahService.prototype._someFunction = function() {

        this._scope['someVar'] = 5;

    }

    return blahService;

});
 9
Author: wbeange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-22 16:42:51

Personalmente creo que pasar $scope a un servicio es una mala idea , porque crea una especie de referencia circular: el controlador depende del servicio y el servicio depende del alcance del controlador.

Además de ser confuso en términos de relaciones, cosas como esta terminan interponiéndose en el camino del recolector de basura.

Mi enfoque preferido es poner un objeto de dominio en el ámbito del controlador y pasarlo al servicio. De esta manera el servicio funciona independientemente de si se utiliza dentro de un controlador o tal vez dentro de otro servicio en el futuro.

Por ejemplo, si se supone que el servicio debe empujar y pop elementos de un array errors, mi código será:

var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);

El servicio interactúa entonces con el controlador operando en errors. Por supuesto, tengo que ser cauteloso sobre nunca eliminar toda la referencia de matriz, pero al final del día eso es una preocupación general de JS.

Nunca querría usar la radiodifusión, $apply y/o cosas similares, porque en mi humilde opinión las buenas prácticas de OO siempre triunfarán sobre cualquier magia Angular.

 6
Author: Marco Faustinelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 15:55:47