web-dev-qa-db-ja.com

AngularJS:ファクトリーとは何ですか?

私はAngular.jsで多くの作業を行ってきましたが、全体的に見て、興味深い強力なフレームワークであることがわかりました。

サービス対工場対プロバイダー対価値について多くの議論があったことは知っていますが、Factoryが何であるかについてはまだかなり混乱しています。

Factoryは、他のStackOverflowの議論で次のように定義されています。

工場

構文:module.factory( 'factoryName', function );結果:factoryNameを注入可能な引数として宣言すると、module.factoryに渡された関数参照を呼び出して返される値が提供されます。

この説明を理解するのは非常に難しく、工場とは何かについての理解を深めるものではありません。

Factoryとは何か、そしてServiceProvider、またはその他の代わりにそれを使用する理由について、誰かが説明や実際の例を共有しますか?

更新

serviceは、任意のオブジェクトへの参照を保持します。

factoryは、任意のobjectを返す関数です。

providerは、任意のfunctionを返す関数です。

-phew-

100
Code Whisperer

私が理解したことから、それらはすべてほとんど同じです。主な違いは複雑さです。プロバイダーは実行時に構成可能で、工場はもう少し堅牢で、サービスは最も単純な形式です。

この質問を確認してください AngularJS:Service vs provider vs factory

また、これは Gist は微妙な違いを理解するのに役立ちます。

ソース: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

jsFiddle: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

著者:Pawel Kozlowski

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

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!";
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!";
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!";
            }
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​
70

私が見る大きな違いの1つは、工場でカスタムコードを実行できることです。ただし、サービスでは、オブジェクトの作成のみが発生します。

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});
18
Hariprasad

このトピックに関する私の2セント。私は非常に初心者であり、Angular JSを理解しているだけであり、これは私を混乱させたものの1つでした。私はインタビューを行うためのメモを作成してきましたが、これは他の人にも役立つかもしれません。

  • サービスと工場は同じことを異なる方法で行います
  • 両方とも注射可能です
  • ほとんどの場合、ファクトリ構文を使用します
  • わかりやすい
  • 最近ではes6クラスに変換されるため、es6で「サービス」が実行されます。
  • コントローラからビジネスロジックを本質的に抽象化する
  • コントローラーでbizロジックを使用する場合、コントローラーでのみ使用できます
  • コントローラーは、長いビジネスロジックを処理しないスコープにデータを置くためのものです
  • 上記のシナリオで起こることは、複雑なビジネスロジックがコントローラーに結び付けられていることです。データ処理用ではありません。そのため、その一部をサービスまたは工場に入れます。したがって、コードは無駄のないモジュール式です。
  • サービスはシングルトンです
10
bytise

サービスはほとんどがオブジェクトであり、オブジェクトのコンストラクタクラスを記述します。フレームワーク内のどこかでObject.create()関数が呼び出され、コントローラーを使用してそのオブジェクトとメソッドを呼び出すことでサービスを使用できます。一方、ファクトリはデフォルトではオブジェクトを作成しないため、すべての属性とメソッドの定義が完了したら、オブジェクトの場所全体を返す必要があります。

0
Kaustubh J