[解決済み】AngularJS 。ファクトリーの代わりにサービスを使用する場合
質問
<ブロッククオートここでご容赦ください。他にもこんな回答があるかと思います。 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のプリミティブや関数を生成できることです"
関連
-
[解決済み】TypeError: window.initMap is not a function
-
[解決済み] AngularJSでkeypressイベントを使用するには?
-
[解決済み] ng-pattern` - 数字だけをチェックする方法は?
-
[解決済み] AngularJS 。scope.apply()呼び出し時の$digest already in progressエラーを防ぐ。
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] ServiceとFactoryで迷う
-
[解決済み] AngularJSのサービスをコンソールからテストするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: window.initMap is not a function
-
[解決済み] X-Frame-Options'を'SAMEORIGIN'に設定しているため、フレーム内での表示を拒否された。
-
[解決済み] AngularJSのリソースプロミス
-
[解決済み] createspyとcreatespyobjの違いは何ですか?
-
AngularJS がエラー $digest already in progress を報告する
-
[解決済み] angular.serviceとangular.factoryの比較
-
[解決済み] 入力フィールドにフォーカスを当てるには?
-
[解決済み] ng-modelとng-bindの違いは何ですか?
-
[解決済み] 条件に応じて特定のルートにリダイレクトする機能
-
[解決済み】AngularJS 。ファクトリーとサービス?重複