2012-07-04 10 views
37

すべてのコントローラからアクセスできるようなユーティリティバンドルを作成するにはどうすればよいですか?共通コントローラ機能を作成する

私は私のメインモジュールで、この経路コードを持っている:

'use strict'; 

angular.module('lpConnect', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/home', {template: 'views/home.html', controller: HomeCtrl}). 
     when('/admin', {template: 'views/admin.html', controller: AdminCtrl}). 
     when('/connect', {template: 'views/fb_connect.html', controller: MainAppCtrl}). 
     otherwise({redirectTo: '/connect'}); 
}]); 

私はHomeCtrlAdminCtrlMainAppCtrlに共通することができる機能が欲しいです。

AngularJSでどうすればいいですか?

答えて

61

一般的なコードを角度で定義する方法は、サービスを使用する方法です。

あなたはそうのような新しいサービスを定義します:あなたがそう

function MainAppCtrl($scope,CommonCode) 
{ 
    $scope.alerter = CommonCode; 
    $scope.alerter.show("Hello World"); 
} 

ちょうどあなたのコントローラの関数の引数としてCommonCodeを含め、このservice..likeを注入でしょう、あなたのコントローラで

.factory('CommonCode', function ($window) { 
     var root = {}; 
     root.show = function(msg){ 
      $window.alert(msg); 
     }; 
     return root; 
    }); 

を。あなたのためにそれを注入するのがAngularです(Dependancy Injectionを読んでここで何が起こっているのか理解してください)。

+6

:ここ

は、2つの最初のserviceを通じてまったく同じことをやってコード、およびfactoryですそれを見つける....あなたがファクトリメソッドを呼び出すことによってサービスを定義することは奇妙ですか?いくつかの命名の改良が、フレームワークの近づきやすさを増やすために大きく進展するように思われる。 – bclinkinbeard

+0

私はAngularJSの周りを頭の中に包んでいるので、私の考えはまさに私の考えです。 'factory()'、 'value()'、 'constant()'、 'service()'は 'provide()'の特定の場合のためのショートカットであり、提供する)サービス。私はドキュメントがどこかに大きな文字で上記の文を置くプルリクエストから利益を得るだろうと思う。 – Tony

+0

率直に言うと、私が最初にこれを始めたとき、私は私を混乱させます。 Factory()は、上の例から分かるように、一般的にシングルトンを返します。 service() - コンストラクタを返します。 value()とconstant()は私が一般的に言うことができる限り、同じことをします。そして、これらはすべて提供()上のラッパー(便利)です... – ganaraj

7

  • プロバイダ
  • 工場
  • 私はので、プロバイダについてあまり話すことはありませんサービス

:のみ)factoryが何であるかを定義し、AngularJSでinject dependenciesから3通りの方法が(共通のコードを定義する)がありますそれは依存性注入のためのより面倒な方法です。しかし、this pageはどのように動作するのか非常によく説明しています。


技術的には、サービス工場同じもののために使用されています。 サービスはコンストラクタ関数ですが、ファクトリはそうではありません。 this postから

module.service('serviceName', function); 

あなたは 機能のインスタンスが提供されます、注射引数としてserviceNameを宣言する。あなたは は、関数にmodule.factoryに渡さ 参照を呼び出すことによって返され値が提供されます、注射引数としてfactoryNameを宣言

module.factory('factoryName', function); 


あなたが好むものを使用し、同じ結果を得ることができます。他の誰

サービス構文

app.service('MyService', function() { 
    this.sayHello = function() { 
    console.log('hello'); 
    }; 
}); 

工場構文

app.factory('MyService', function() { 
    return { 
    sayHello: function() { 
     console.log('hello'); 
    } 
    } 
}); 
関連する問題