1. ホーム
  2. angularjs

[解決済み】AngularJS 。ファクトリーの代わりにサービスを使用する場合

2022-03-30 02:08:55

質問

<ブロッククオート

ここでご容赦ください。他にもこんな回答があるかと思います。 AngularJS:サービス vs プロバイダ vs ファクトリ

しかし、どのような場合にファクトリーではなくサービスを使うのか、まだ理解できません。

私が知る限り、factory は複数のコントローラから呼び出される共通の関数を作成するためによく使用されます。 コントローラ共通関数の作成

Angularのドキュメントでは、サービスよりもファクトリーが好まれているようです。彼らはファクトリーを使うとき、"service" を参照していますが、これはさらに混乱させます。 http://docs.angularjs.org/guide/dev_guide.services.creating_services

では、どのような場合にサービスを利用するのでしょうか。

サービスでなければできないこと、あるいはもっと簡単にできることはありますか?

裏側で起きていることは何か違うのでしょうか?パフォーマンスやメモリの違いはありますか?

以下はその例です。宣言の方法以外は同じように見えますが、なぜ一方を行うのか、もう一方を行うのか、その理由がわからないのです。 http://jsfiddle.net/uEpkE/

更新しました。 Thomasの回答から、serviceはよりシンプルなロジックに、factoryはプライベートメソッドを含むより複雑なロジックに対応することを示唆しているようです。以下のフィドルコードを更新してみましたが、どちらもプライベート関数に対応できるようですね。

myApp.factory('fooFactory', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo; }

    return {
        setFoobar: function(foo){
            addHi(foo);
        },
        getFoobar:function(){
            return fooVar;
        }
    };
});
myApp.service('fooService', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo;}

    this.setFoobar = function(foo){
        addHi(foo);
    }
    this.getFoobar = function(){
        return fooVar;
    }
});

function MyCtrl($scope, fooService, fooFactory) {
    fooFactory.setFoobar("fooFactory");
    fooService.setFoobar("fooService");
    //foobars = "Hi fooFactory, Hi fooService"
    $scope.foobars = [
        fooFactory.getFoobar(),
        fooService.getFoobar()
    ];
}

解決方法は?

説明

違うものが出てきましたね。

まず、1つ目。

  • サービスを利用する場合は、次のようになります。 関数のインスタンス (" this " キーワード)。
  • ファクトリーを使用する場合、次のようになります。 によって返される値です。 関数リファレンスを呼び出す (ファクトリーのreturn文)。

を参照してください。 angular.service vs angular.factory

2つ目

AngularJSのすべてのプロバイダ(値、定数、サービス、ファクトリー)はシングルトンであることを念頭に置いてください。

第三に

どちらか一方(サービスまたはファクトリー)を使用することは、コードのスタイルに関することです。 しかし、その 共通方法 AngularJSでは ファクトリー .

なぜ?

なぜなら ファクトリーメソッドは、AngularJSの依存性注入システムでオブジェクトを取得する最も一般的な方法です。これは非常に柔軟で、洗練された作成ロジックを含むことができます。ファクトリーは通常の関数なので、新しいレキシカルスコープを利用して "private"変数をシミュレートすることも可能です。これは、与えられたサービスの実装の詳細を隠すことができるため、非常に便利です。

( レフ : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).


使用方法

サービス を追加するだけで呼び出すことができる便利なユーティリティ関数を共有するのに役立つかもしれません。 () を注入された関数参照に追加します。を使って実行することもできます。 injectedArg.call(this) などがあります。

工場: インスタンスを作成するためにnew`することができる'クラス'関数を返すのに便利かもしれません。

だから 複雑なロジックがある場合はファクトリーを使用する をサービス内で使用し この複雑さを表に出したくない場合 .

その他の場合 サービスのインスタンスを返したい場合は、単にサービス .

でも、そのうち、80%のケースでファクトリーを使うようになると思います。

詳しくはこちら http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/


UPDATE :

素晴らしい投稿はこちら 。 http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html

<ブロッククオート

機能が欲しいなら を通常の関数と同様に呼び出すことができます。 を使用します。 工場 . 関数をnewでインスタンス化したい場合 演算子を使用します。違いがわからなければ、factory." を使ってください。


UPDATE :

AngularJSのチームが仕事をし、説明をしています。 http://docs.angularjs.org/guide/providers

そして、このページから :

FactoryとServiceは、最もよく使われるレシピです。両者の唯一の違いは、Serviceレシピはカスタムタイプのオブジェクトに対してより良く機能し、FactoryはJavaScriptのプリミティブや関数を生成できることです"