次の方法で定義されたAngularJSサービスがあります
angular.module('myService').service('myService', function() {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// how to call publicFunction(param)?
...
};
});
myService.publicFunction(xxx)
そして、最初の関数をサービスの外側 (これは で正常に動作します) と同じサービス内の別の関数、つまり の両方から呼び出したいと思いanotherPublicFunction
ます。どちらもthis.publicFunction(param)
2myService.publicFunction(param)
番目の関数内からは機能しませんが、それは理解できます。
編集:
実際、問題全体は、私の例だけでは再現できないことが原因でした。別のコントローラーの別の関数にコールバック パラメーターとして 2 番目の関数を渡しましたが、それが呼び出されたときに、への参照がthis
機能しません。
例えば
anotherService.someCall('a', 123, myService.anotherPublicFunction);
解決できないanotherPublicFunction
ため、内部で失敗します。this
問題を示すためにプランカーを作成しました: http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info
(他の人に役立つ場合に備えて、ここに質問を残しておきます。)
サービスへの参照またはこのような最初の関数を使用して、問題を回避できることを知っています
var ms = this;
this.anotherPublicFunction(param) {
ms.publicFunction(param);
...
};
またはこれ
var pf = this.publicFunction;
this.anotherPublicFunction(param) {
pf(param);
...
};
しかし、どちらも汚いハックのようです。
この場合、2 番目の関数から最初の関数を呼び出す良い方法はありますか? それとも、このようなサービスを提供するために、そもそも何か間違ったことをしているのでしょうか?
私はこれらの質問を良い答えで見つけました:
しかし、それらの1つは呼び出される別の内部関数を持ち、もう1つはサービスの代わりにファクトリを使用していたため、私の問題とは異なります。
編集:
これを投稿した後、私はすぐにこれもできることに気付きました:
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
これまでのところ、他のオプションほど悪くはないようです...より良いアプローチはありますか?