219

2016年1月編集:これはまだ注目されているためです。これを尋ねて以来、私はいくつかの AngularJS プロジェクトを完了しました。私が主に使用したものについてはfactory、オブジェクトを構築し、最後にオブジェクトを返しました。ただし、以下の私の声明は依然として真実です。

EDIT : 2つの主な違いを最終的に理解したと思います。デモ用のコード例があります。また、この質問は提案された複製とは異なると思います。複製では、サービスはインスタンス化できないと書かれていますが、以下で説明するように設定すると、実際にはインスタンス化できます。サービスは、ファクトリとまったく同じになるように設定できます。また、ファクトリがサービスをフェイルオーバーする場所を示すコードも提供しますが、これは他の回答ではないようです。

VaderService をそのように (つまり、サービスとして) セットアップした場合:

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    this.speak = function (name) {
        return 'Join the dark side ' + name;
    }
});

次に、コントローラーでこれを行うことができます:

module.controller('StarWarsController', function($scope, VaderService) {
    $scope.luke = VaderService.speak('luke');   
});

サービスでは、コントローラーに注入された VaderService がインスタンス化されるため、VaderService.speak を呼び出すだけで済みますが、VaderService を module.factory に変更すると、コントローラー内のコードが機能しなくなります。これが主な違いです。 . factory では、コントローラに注入された VaderService はインスタンス化されないため、ファクトリをセットアップするときにオブジェクトを返す必要があります (質問の例を参照してください)。

ただし、ファクトリをセットアップするのとまったく同じ方法でサービスをセットアップでき (つまり、オブジェクトを返すようにします) 、サービスはファクトリとまったく同じように動作します。

この情報を考えると、service よりも factory を使用する理由がわかりません。service は factory ができるすべてのことを行うことができます。

以下の元の質問。


これは何度も聞かれていることは知っていますが、ファクトリとサービスの間に機能的な違いはまったく見られません。このチュートリアルを読みました: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

そして、それはかなり良い説明を与えるようですが、私は次のようにアプリを設定しました:

index.html

<!DOCTYPE html>
<html>
    <head>
    <title>My App</title>
    <script src="lib/angular/angular.js"></script>
    <script type="text/javascript" src="js/controllers.js"></script>
    <script type="text/javascript" src="js/VaderService.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
    </head>

    <body ng-app="MyApp"> 
        <table ng-controller="StarWarsController">
            <tbody>
            <tr><td>{{luke}}</td></tr>
            </tbody>
        </table>
    </body>
</html>

app.js:

angular.module('MyApp', [
  'MyApp.services',
  'MyApp.controllers'
]);

controllers.js:

var module = angular.module('MyApp.controllers', []);

module.controller('StarWarsController', function($scope, VaderService) {
    var luke = new VaderService('luke');
    $scope.luke = luke.speak();
});

VaderService.js

var module = angular.module('MyApp.services', []);

module.factory('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

その後、index.html を読み込むと、「Join the dark side luke」と表示されます。まさに予想通り。ただし、VaderService.js をこれに変更すると (module.factory ではなく module.service に注意してください):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

次に、index.html をリロードします (キャッシュを空にして、ハード リロードを実行したことを確認しました)。これは、module.factory で行ったのとまったく同じように機能します。では、両者の実際の機能上の違いは何ですか??

4

4 に答える 4

300

サービス工場


ここに画像の説明を入力 ここに画像の説明を入力

ファクトリとサービスの違いは、関数とオブジェクトの違いのようなものです

工場提供者

  • 関数の戻り値を返します。オブジェクトを作成し、それにプロパティを追加して、同じオブジェクトを返すだけです。このサービスをコントローラーに渡すと、オブジェクトのこれらのプロパティは、ファクトリを介してそのコントローラーで使用できるようになります。(仮想シナリオ)

  • シングルトンで、一度だけ作成されます

  • 再利用可能なコンポーネント

  • Factory は、データの共有など、コントローラー間の通信に最適な方法です。

  • 他の依存関係を使用できます

  • 通常、サービス インスタンスに複雑な作成ロジックが必要な場合に使用されます

  • 関数に注入できません.config()

  • 構成不可能なサービスに使用

  • オブジェクトを使用している場合は、ファクトリ プロバイダーを使用できます。

  • 構文:module.factory('factoryName', function);

サービスプロバイダー

  • 関数 (オブジェクト) のインスタンスを提供します。'new' キーワードでインスタンス化したところです。'this' にプロパティを追加すると、サービスは 'this' を返します。サービスをコントローラに渡すと、それらのプロパティが返されます。 on 'this' は、サービスを通じてそのコントローラーで利用できるようになります。(仮想シナリオ)

  • シングルトンで、一度だけ作成されます

  • 再利用可能なコンポーネント

  • サービスは、データを共有するためのコントローラー間の通信に使用されます

  • thisキーワードを使用して、サービス オブジェクトにプロパティと関数を追加できます。 

  • 依存関係はコンストラクターの引数として注入されます

  • 単純な作成ロジックに使用

  • 関数に注入できません.config()

  • クラスを使用している場合は、サービスプロバイダーを使用できます

  • 構文:module.service(‘serviceName’, function);

サンプルデモ

以下の例では、defineMyServiceとがありますMyFactory。Inを.service使用してサービス メソッドを作成した方法に注意してください。ファクトリ オブジェクトを作成し、それにメソッドを割り当てました。this.methodname..factory

AngularJS .service


module.service('MyService', function() {

    this.method1 = function() {
            //..method1 logic
        }

    this.method2 = function() {
            //..method2 logic
        }
});

AngularJS .factory


module.factory('MyFactory', function() {

    var factory = {}; 

    factory.method1 = function() {
            //..method1 logic
        }

    factory.method2 = function() {
            //..method2 logic
        }

    return factory;
});

また、この美しいものを見てください

サービスと工場について混乱している

AngularJS ファクトリー、サービス、およびプロバイダー

Angular.js: サービス vs プロバイダー vs 工場?

于 2014-04-15T06:24:53.597 に答える
45

FactoryandServiceは a のラッパーですprovider

工場

Factoryclass(constructor function)instance of classstringnumberまたはのいずれかを返すことができますbooleanconstructor関数を返す場合は、コントローラーでインスタンス化できます。

 myApp.factory('myFactory', function () {

  // any logic here..

  // Return any thing. Here it is object
  return {
    name: 'Joe'
  }
}

サービス

サービスは何も返す必要はありません。ただし、すべてをthis変数に割り当てる必要があります。サービスはデフォルトでインスタンスを作成し、それをベースオブジェクトとして使用するためです。

myApp.service('myService', function () {

  // any logic here..

  this.name = 'Joe';
}

サービスの背後にある実際の angularjs コード

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
        return $injector.instantiate(constructor);
    }]);
}

の単なるラッパーfactoryです。から何かを返すとservice、 のように動作しますFactory

IMPORTANT: Factory と Service からの戻り結果はキャッシュされ、すべてのコントローラーに対して同じ結果が返されます。

いつ使用する必要がありますか?

Factoryほとんどの場合、すべての場合に適しています。constructor異なるコントローラーでインスタンス化する必要がある関数がある場合に使用できます。

ServiceSingletonオブジェクトの一種です。サービスから返されるオブジェクトは、すべてのコントローラーで同じになります。アプリケーション全体で単一のオブジェクトを使用する場合に使用できます。例: 認証されたユーザーの詳細。

さらに理解を深めるために、以下をお読みください

http://iffycan.blogspot.in/2013/05/angular-service-or-factory.html

http://viralpatel.net/blogs/angularjs-service-factory-tutorial/

于 2014-04-15T04:56:45.063 に答える
7
  • サービスを使用すると、関数のインスタンスが取得されます ("this" キーワード)。
  • ファクトリを使用する場合は、関数参照 (ファクトリの return ステートメント) を呼び出すことによって返される値を取得します。

Factory と Service は、最も一般的に使用されるレシピです。それらの唯一の違いは、Service レシピがカスタム タイプのオブジェクトに対してより適切に機能するのに対し、Factory は JavaScript プリミティブと関数を生成できることです。

参照

于 2014-04-15T04:53:05.530 に答える