¿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:
- Angularjs comparte funciones dentro del servicio
- AngularJs llama una función de servicio interno de uno mismo
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){
...
};
});