¿Es correcto pasar la "corriente" $scope
a un servicio AngularJS?
Estoy en la situación en la que tengo un $ service sabiendo que solo lo consume un controlador, y me gustaría tener una referencia al alcance del controlador en los métodos $ service.
¿Es esto filosóficamente correcto?
¿O sería mejor transmitir eventos al $ rootScope y luego hacer que mi controlador los escuche?
angularjs
data-binding
angularjs-scope
angular-services
CAROLINA DEL SUR
fuente
fuente
$scope
propiedades y llamar$scope.$apply
cuando sea necesario.$scope
... ¿cómo accedería el controlador directamente a los datos en el servicio y los pasaría a la vista sin hacer esto?Respuestas:
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 llamarlo en un alcance específico o en la raíz.En cuanto a la lectura de la variable, sería mejor si recibiera los parámetros. Pero también podría leerlo desde un alcance como un parámetro de objeto, pero yo iría con el parámetro, eso haría que su interfaz de servicio sea mucho más clara.
fuente
$scope
través de una llamada a un servicio usando unaexecuteSql()
función asíncrona . Buscando en 3 opciones (1) use una devolución de llamada en la función asíncrona, luego llame$scope.$apply
... esto funciona, pero es feo (2) pase$scope
a la función asíncrona, luego llametheScope.$apply()
... esto también funciona (3) use una promesa. ..no he probado esto todavía. ¿Por qué una promesa es la mejor manera? ¡Gracias!Yo diría que si su funcionalidad es específica de un solo controlador, no necesita un servicio.
Las tareas de los controladores son manipular el modelo específico, mientras que un servicio debe ocuparse de tareas globales. Prefiero ceñirme a este paradigma en lugar de mezclar las cosas.
Esto es lo que dicen los doctores
Servicio
Controlador
PD: Aparte de eso, si necesita digerir, también puede inyectar $ rootScope dentro de su servicio.
fuente
$apply
o$digest
el $ rootScope tiene mucho sentido para mí.Si. Puede pasar $ scope al servicio cuando lo inicializa. En el constructor de servicios, puede asignar el alcance a algo como this._scope y luego hacer referencia al alcance dentro del servicio.
fuente
$scope
vez que ese controlador inyecta el servicio, para no tener que llamar a un método en el servicio y pasarlo manualmente$scope
.new MyFunction()
). La pregunta se refería a un servicio, donde llamarnew
no es una opción.Personalmente, creo que pasar
$scope
a un servicio es una mala idea , porque crea una 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 alcance del controlador y pasarlo al servicio. De esta manera, el servicio funciona independientemente de si se usa dentro de un controlador o tal vez dentro de otro servicio en el futuro.
Por ejemplo, si se supone que el servicio empuja y saca elementos de una matriz
errors
, mi código será:El servicio interactúa luego con el controlador operando
errors
. Por supuesto, debo tener cuidado de no borrar nunca toda la referencia de la matriz, pero al final del día, eso es una preocupación general de JS.Nunca querría usar la transmisió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.fuente
$scope.errors = []; $scope.myService = new MyService($scope.errors);
errors
vive independientemente de$scope
. Ese es el objetivo de esta respuesta. Por favor, consulte el enlace que proporcioné en el texto. Salud.$scope.errors
está apuntando avar errors
, y los errores de variable me parecen redundantes, ya que es solo otro puntero. Una situación similar se me ocurre y que es abiertamente redundante es este pedazo de código:const errors = errors2 = errors3 = []; $scope.errors = errors;
. ¿Está de acuerdo en que solo con el fragmento de código que proporcionó parecevar errors = []
redundante?errors
vive independientemente de$scope
. Debe comprender qué es un objeto de dominio, así como qué es unavar
asignación. Si el enlace que proporcioné no es suficiente, hay mucho más material disponible.MyService(errors)
. Según tengo entendido, el servicio debería generar una matriz de registro basada en el parámetro (que en este caso es un puntero). Para mí, ese es un mal patrón, ya que los servicios son singletons en angular. Si la implementación del servicio está bien programada, debería generar el arreglo en una variable interna (para seguir siendo un singleton). Por lo tanto, no tiene sentido inicializar la variable fuera del servicio.