angularjs

¿Llamar a una función en el servicio AngularJS desde el mismo servicio?



ng-href angular 5 (11)

Bueno, solo cree dos punteros / variables de función más para sus funciones de servicio con variables locales en servicio y utilícelas para llamar a las funciones de servicio desde el mismo servicio:

*

angular.module(''myService'').service(''myService'', function() { **var ref1, ref2;** this.publicFunction = **ref1** = function(param) { ... }; this.anotherPublicFunction = **ref2** = function(param) { // how to call publicFunction(param)? **ref1(argument);** ... }; });

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 por myService.publicFunction(xxx) ) y desde otra función en el mismo servicio, es decir, anotherPublicFunction . Ni uno de this.publicFunction(param) ni myService.publicFunction(param) no funcionará desde dentro de la segunda función, y puedo entender eso.

EDITAR:
En realidad, todo el problema fue causado por algo que no puedes reproducir con solo mi ejemplo. Pasé la segunda función como un parámetro de devolución de llamada a otra función en un controlador por separado, y cuando se llama, la referencia a this no funciona.

P.ej

anotherService.someCall(''a'', 123, myService.anotherPublicFunction);

falla dentro de anotherPublicFunction porque this no se puede resolver.

Escribí un Plunker para mostrar el problema: http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info

(Debo dejar la pregunta aquí en caso de que ayude a alguien más).

Sé que podría solucionar el problema utilizando 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 sucios hacks.

¿Hay una buena manera de llamar a la primera función desde la segunda en este caso? ¿O estoy haciendo algo totalmente malo en primer lugar para tener un servicio como este?

Encontré estas preguntas con buenas respuestas:

pero difieren de mi problema, ya que uno de ellos tiene una función interna separada que debía llamarse, 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 podría hacer esto:

var actualWork = function(param) { ... } this.publicFunction(param) { actualWork(param); }; this.anotherPublicFunction(param) { actualWork(param); ... };

que no parece tan malo como las otras opciones hasta ahora ... ¿Hay mejores enfoques?


Creo que la mejor manera es seguir así:

var myFunctions = { myFunc1: function(param) { }, myFunc2: function(param) { return foo + myFunctions.myFunc1(param)// do some stuff with the first function } } return myFunctions;

porque creo que si usa esto , puede entrar en conflicto con el alcance donde utiliza el servicio.


Debajo de la solución funcionó para mí:

angular.module(''myService'').service(''myService'', function() { var self= { this.publicFunction(param) { ... }; this.anotherPublicFunction(param) { // You can call the publicfunction like below self.publicFunction(param); ... }; return self; } ]);`


La mejor y más fácil manera de llamar es:

myapp.service("SomeService", function ($http) { this.func1 = function (params) { // Some thing the service returns return something; } this.func2 = function (params) { // Some thing the service returns var resp = this.func1(params); return something; } }


Me encontré con este problema dentro de mi propia codificación angular y opté por utilizar esta forma de la solución:

angular.module(''myService'').service(''myService'', function() { var myService = this; myService.publicFunction(param) { ... }; myService.anotherPublicFunction(param) { myService.publicFunction(param); ... }; });

Preferí este enfoque porque en mi código utilizo publicFunction y dentro de otra PublicFunction I loop sobre varios params que necesitan llamar a publicFunction como parte del proceso.


Puede devolver un objeto desde su servicio como

return { myFunc1: function(param) { }, myFunc2: function(param) { return foo + this.myFunc1(param)// do some stuff with the first function } }

Entonces, acceda desde el exterior con service.myFunc1 y desde adentro de sus funciones internas con esto.


Puede establecer ''esto'' como variable

angular.module(''myService'').service(''myService'', function() { var that = this; this.publicFunction(param) { ... }; this.anotherPublicFunction(param) { that.publicFunction(param); }; });


Si desea utilizar la declaración de fábrica en lugar del servicio, puede:

angular.module(''myService'').factory(''myService'', function() { var myService = {}; myService.publicFunction = function(param) { ... }; myService.anotherPublicFunction = function(param) { // call publicFunction(param) like so myService.publicFunction(param); }; return myService; });


Suena bien, pero ¿qué haces cuando ya no es = el servicio?

Este es el caso en el siguiente ejemplo:

return { myFunc1: function(param) { }, myFunc2: function(param) { scope.$watchCollection(param,function(v) { return foo + this.myFunc1(param)// do some stuff with the first function } } }

Debido a la function(v) { ahora se encuentra en otra función dentro de la función y este ya no es el servicio sino la ventana.


así es como lo implementé:

.service(''testSvc'', function () { return { f1: function (v1) { alert(''f1 > v1='' + v1); }, f2: function (v2) { alert(''f2 > v2='' + v2); this.f1(''az''); //use ''this'' } }

})


angular.module(''myService'').service(''myService'', function() { return { myFunc2: function(param) { return foo + myFunc1(param); } }; function myFunc1(param){ ... }; });