Ich habe einen AngularJS-Dienst wie folgt definiert
angular.module('myService').service('myService', function() {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// how to call publicFunction(param)?
...
};
});
und ich möchte die erste Funktion sowohl von außerhalb des Dienstes (was gut funktioniert myService.publicFunction(xxx)
) als auch von einer anderen Funktion im selben Dienst aufrufen , d anotherPublicFunction
. h .Keiner von beiden funktioniert innerhalb der zweiten Funktion this.publicFunction(param)
oder myService.publicFunction(param)
wird nicht funktionieren, und das kann ich verstehen.
EDIT:
Eigentlich wurde das ganze Problem durch etwas verursacht, das man mit meinem Beispiel allein nicht reproduzieren kann. Ich habe die zweite Funktion als Rückrufparameter an eine andere Funktion in einem separaten Controller übergeben, und wenn sie aufgerufen wird, this
funktioniert der Verweis auf nicht.
Z.B
anotherService.someCall('a', 123, myService.anotherPublicFunction);
schlägt innen fehl, anotherPublicFunction
weil this
nicht gelöst werden kann.
Ich habe einen Plunker geschrieben, um das Problem zu zeigen: http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info
(Ich werde die Frage immer noch hier lassen, falls sie jemand anderem hilft.)
Ich weiß, dass ich das Problem umgehen kann, indem ich einen Verweis auf den Dienst oder die erste Funktion wie diese verwende
var ms = this;
this.anotherPublicFunction(param) {
ms.publicFunction(param);
...
};
oder dieses
var pf = this.publicFunction;
this.anotherPublicFunction(param) {
pf(param);
...
};
aber beide scheinen wie schmutzige Hacks.
Gibt es in diesem Fall eine gute Möglichkeit, die erste Funktion von der zweiten aufzurufen? Oder mache ich überhaupt etwas völlig falsch, um einen solchen Service zu haben?
Ich fand diese Fragen mit guten Antworten:
- Angularjs teilen Funktionen innerhalb des Dienstes
- AngularJs rufen eine interne Servicefunktion von self auf
Sie unterscheiden sich jedoch von meinem Problem, da einer von ihnen eine separate interne Funktion hat, die aufgerufen werden sollte, und der andere eine Fabrik anstelle eines Dienstes verwendet.
BEARBEITEN:
Nachdem ich dies gepostet hatte, wurde mir sofort klar, dass ich das auch tun könnte:
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
Das scheint nicht ganz so schlimm zu sein wie die anderen Optionen bisher ... Gibt es bessere Ansätze?
var ms = this;
(was öfter als geschrieben wirdvar self = this;
) "einen schmutzigen Hack"?