angular.service と angular.factory 質問する

angular.service と angular.factory 質問する

私は両方を見ました角度ファクトリー()そして角度サービス()以前はサービスを宣言していましたが、私は見つけることができません angular.service公式ドキュメントのどこにも記載されていません。

2 つの方法の違いは何ですか?
どちらを何に使用すればよいですか (異なる目的があると仮定した場合)?

ベストアンサー1

  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

私自身、この概念を次のように考えるまで、なかなか理解できませんでした。

サービス:記述する関数はnewになります:

  myInjectedService  <----  new myServiceFunction()

ファクトリー:記述した関数(コンストラクター) が呼び出されます:

  myInjectedFactory  <---  myFactoryFunction()

それをどうするかはあなた次第ですが、役に立つパターンがいくつかあります...

たとえば、パブリック API を公開するためのサービス関数を記述します。

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

または、ファクトリ関数を使用してパブリック API を公開します。

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }
  
  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

または、ファクトリ関数を使用してコンストラクターを返します。

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

どれを使えばいいのでしょうか…?

どちらでも同じことを実現できます。ただし、場合によっては、ファクトリーを使用すると、よりシンプルな構文で注入可能なものを作成するための柔軟性が少し高まります。これは、myInjectedService は常にオブジェクトである必要があるのに対し、myInjectedFactory はオブジェクト、関数参照、または任意の値にすることができるためです。たとえば、コンストラクターを作成するサービス (上記の最後の例のように) を記述した場合、次のようにインスタンス化する必要があります。

var myShinyNewObject = new myInjectedService.myFunction()

これはおそらくこれよりも望ましくないと言えます。

var myShinyNewObject = new myInjectedFactory();

(ただし、コントローラー内のオブジェクトをnewすると、追跡が困難な依存関係が作成され、テスト用にモックするのが難しくなるため、そもそもこのタイプのパターンを使用する際には注意が必要です。new()無計画に使用するよりも、サービスを使用してオブジェクトのコレクションを管理する方が適切です。)


さらに、それらはすべてシングルトンです...

また、どちらの場合も、Angular がシングルトンの管理に役立っていることに留意してください。サービスや関数をどこに何回挿入するかに関係なく、同じオブジェクトまたは関数への同じ参照が取得されます。(ファクトリが数値や文字列などの値を返す場合は例外です。その場合は、常に同じ値が取得されますが、参照は取得されません。)

おすすめ記事