78

次の方法で定義された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);
  ...
};

これまでのところ、他のオプションほど悪くはないようです...より良いアプローチはありますか?

4

11 に答える 11

33

私は独自のAngularコーディングでこの問題に遭遇し、この形式のソリューションを使用することを選択しました:

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

  myService.anotherPublicFunction(param) {
    myService.publicFunction(param);
    ...
  };
});

私のコードではpublicFunctionを使用し、別のPublicFunctionの内部では、プロセスの一部としてpublicFunctionを呼び出す必要があるいくつかのパラメーターをループするため、このアプローチを好みました。

于 2015-06-29T17:58:05.347 に答える
4

次のように、サービス内からオブジェクトを返すことができます

return {

    myFunc1: function(param) {

    },

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

}

したがって、これを使用してservice.myFunc1内部関数を使用して外部からアクセスし、内部からアクセスします。

于 2013-11-07T18:33:37.177 に答える
0

これが私が実装した方法です:

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

}))

于 2016-06-04T12:18:25.173 に答える