¿Llamando a una función en el servicio AngularJS desde el mismo servicio?
Tengo un servicio AngularJS definido de la siguiente manera
angular.module('myService').service('myService', function() {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// how to call publicFunction(param)?
...
};
});
y me gustaría llamar a la primera función desde fuera del servicio (que funciona bien almyService.publicFunction(xxx)
) y de otra función en el mismo servicio, es decir,anotherPublicFunction
. Ninguno dethis.publicFunction(param)
omyService.publicFunction(param)
no funcionará desde dentro de la segunda función, y puedo entenderlo.
EDITAR:
En realidad, todo el problema fue causado por algo que no se puede reproducir solo con mi ejemplo. Pasé la segunda función como un parámetro de devolución de llamada a otra función en un controlador separado, y cuando se llama, la referencia athis
no funciona
P.ej.
anotherService.someCall('a', 123, myService.anotherPublicFunction);
falla dentroanotherPublicFunction
porquethis
no se puede resolver
He escrito un Plunker para mostrar el problema: http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info
(Aún dejaré la pregunta aquí en caso de que ayude a alguien más).
Sé que podría solucionar el problema usando una referencia al servicio o la primera función como esta
var ms = this;
this.anotherPublicFunction(param) {
ms.publicFunction(param);
...
};
o esto
var pf = this.publicFunction;
this.anotherPublicFunction(param) {
pf(param);
...
};
Pero ambos parecen hacks sucios.
¿Hay una buena manera de llamar a la primera función de la segunda en este caso? ¿O estoy haciendo algo totalmente incorrecto en primer lugar para tener un servicio como este?
Encontré estas preguntas con buenas respuestas:
Angularjs comparte funciones dentro del servicio.AngularJs llama a una función de servicio interno desde uno mismopero difieren de mi problema ya que uno de ellos tiene una función interna separada que se llamará, y el otro usaba una fábrica en lugar de un servicio.
EDITAR:
Después de publicar esto, inmediatamente me di cuenta de que también podía hacer esto:
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
lo que no parece tan malo como las otras opciones hasta ahora ... ¿Hay mejores enfoques?