AngularJS:ファクトリーとサービス?[複製]

218
Cameron Ball 2014-04-15 18:47.

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

編集:私は最終的に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に変更すると、コントローラーのコードが機能しなくなります。これが主な違いです。 。ファクトリでは、コントローラに注入されたVaderServiceインスタンス化されません。そのため、ファクトリを設定するときにオブジェクトを返す必要があります(質問の私の例を参照)。

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

この情報を考えると、サービスよりもファクトリーを使用する理由はわかりません。サービスはファクトリーができることすべてを実行できます。

以下の元の質問。


これは何度も聞かれていることは知っていますが、工場とサービスの機能的な違いは実際にはわかりません。私はこのチュートリアルを読みました: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をロードすると、「ダークサイドルークに参加」が表示されます。まさに期待通り。ただし、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で行ったのと同じ。では、2つの実際の機能の違いは何ですか?

4 answers

297
Nidhish Krishnan 2014-04-15 20:24.

サービスvsファクトリー


ファクトリとサービスの違いは、関数とオブジェクトの違いと同じです。

ファクトリープロバイダー

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

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

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

  • ファクトリは、データの共有など、コントローラ間で通信するための優れた方法です。

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

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

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

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

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

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

サービスプロバイダー

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

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

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

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

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

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

  • 単純な作成ロジックに使用されます

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

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

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

サンプルデモ

以下の例では、MyServiceとを定義しています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ファクトリー、サービス、プロバイダー

AngularJS:サービスvsプロバイダーvsファクトリ

44
Fizer Khan 2014-04-15 18:56.

FactoryService単なるラッパーですprovider

工場

Factoryことができます何かを返すことができclass(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すべての場合に最も望ましいです。constructorさまざまなコントローラーでインスタンス化する必要がある機能がある場合に使用できます。

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

さらに理解するには、

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

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

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

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

参照

4
null 2014-04-15 19:31.

$ provideサービス

それらは技術的には同じものであり、実際providerには$provideサービスの機能を使用するという異なる表記法です。

  • クラスを使用している場合:サービス表記を使用できます。
  • オブジェクトを使用している場合:ファクトリ表記を使用できます。

表記唯一の違いは、サービスが新しく、ファクトリが新しくないことです。しかし、他のすべてについては、それらは両方とも同じように見え匂いがし、そして振る舞います。繰り返しますが、これは$ provide.provider関数の省略形にすぎませservicefactory

// Factory

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

  var _myPrivateValue = 123;

  return {
    privateValue: function() { return _myPrivateValue; }
  };

});

// Service

function MyService() {
  this._myPrivateValue = 123;
}

MyService.prototype.privateValue = function() {
  return this._myPrivateValue;
};

angular.module('myApp').service('MyService', MyService);

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

アトランタのドナ・ブラジル:「私があなたに私の話をするとき私を踏まないでください」

アトランタのドナ・ブラジル:「私があなたに私の話をするとき私を踏まないでください」

2017年11月19日にアトランタで開催されたドナブラジルとモーアイボリー(ダグスミスフォトグラフィー)ドナブラジルを見逃すことはありません。

彼らは北朝鮮から脱出した亡命者の胃の中に奇妙な寄生虫を見つけました

彼らは北朝鮮から脱出した亡命者の胃の中に奇妙な寄生虫を見つけました

画像:ゲッティ陰謀愛好家は新しくてエキサイティングなディスカッション資料を持っています:国境を越えて韓国に5発撃たれた北朝鮮の脱北者は寄生虫でいっぱいで、そのうちの1人は南のメディアは、寄生虫を持った北朝鮮の脱北者を見つけることは珍しいことではないと報告している、実際、男性が30以上のタイプを持っていたケースがあった。

パニッシャーの第2話は、複雑な陰謀の網を織り交ぜています

パニッシャーの第2話は、複雑な陰謀の網を織り交ぜています

写真:パニッシャー(Netflix)これらのMarvel Netflixが愛していることが1つあるとすれば、それは複雑な政府や企業の陰謀です。そして、なぜこれらのショーがそのルートを選択するのかを理解するのは簡単です。

最新のBoseヘッドフォンは音楽を聴くためのものではなく、パートナーの鼻を鳴らすためのものです。

最新のBoseヘッドフォンは音楽を聴くためのものではなく、パートナーの鼻を鳴らすためのものです。

あなたのパートナーはチェーンソーのように詮索し、あなたを眠らせませんか?あなたのパートナーはあなたがチェーンソーのように詮索したと主張しますが、あなたが詮索しないので彼らは彼の想像ですか?あなたのケースが何であれ、Bose(はい、ハイエンドオーディオ機器のメーカー)はあなたのために何かを持っています。それらはBoseSleepbudsと呼ばれます。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language