change - Pasar el alcance actual a un Servicio AngularJS
page title angular 4 (4)
Diría que si su funcionalidad es específica para un solo controlador, entonces no necesita un servicio.
Las tareas de los controladores consisten en manipular el modelo específico, mientras que un servicio debe ocuparse de las tareas globales. Preferiría mantener este paradigma en lugar de mezclar las cosas.
Esto es lo que dicen los doctores
Servicio
Los servicios angulares son singletons que llevan a cabo tareas específicas comunes a las aplicaciones web
Controlador
En Angular, un controlador es una función de JavaScript (tipo / clase) que se utiliza para aumentar las instancias de Ámbito angular, excluyendo el ámbito raíz.
PD: Además de eso, si necesita digerir también puede inyectar $ rootScope dentro de su servicio.
¿Es correcto pasar el $scope
"actual" a un servicio AngularJS?
Estoy en la situación en la que tengo un $ servicio sabiendo que es consumido por un solo controlador, y me gustaría tener una referencia al alcance del controlador en los mismos métodos de servicio.
¿Es esto filosóficamente correcto?
¿O será mejor que transmita eventos al $ rootScope y luego haga que mi controlador los escuche?
Para que el controlador sepa cuándo ocurre algo asíncrono, use las promesas angulares .
Para provocar el $apply
, no necesita el alcance, puede llamar $rootScope.$apply
, ya que no hay diferencia al llamarlo en un alcance específico o en la raíz.
En cuanto a la variable de lectura, sería mejor si recibió los 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 su interfaz de servicio mucho más clara.
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 en el camino del recolector de basura.
Mi enfoque preferido es poner un objeto de dominio en el alcance del controlador y pasarlo al servicio. De esta forma, el servicio funciona independientemente de si se usa dentro de un controlador o tal vez dentro de otro en el futuro.
Por ejemplo, si se supone que el servicio empuja y extrae elementos de un array de errors
, mi código será:
var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
El servicio interactúa luego con el controlador operando en errors
. Por supuesto, tengo que ser cauteloso sobre nunca borrar toda la referencia de matriz, pero al final del día esa es una preocupación general de JS.
Nunca me gustaría utilizar broadcasting, $apply
y / o cosas similares, porque buenas prácticas de OO siempre prevalecerán sobre cualquier magia angular.
Sí. Puede pasar $ scope al servicio cuando lo inicializa. En el constructor del servicio puede asignar el alcance a algo como this._scope y luego hacer 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;
});