40

すべてのコントローラーからアクセスできるある種のutilsバンドルを作成するにはどうすればよいですか?

メインモジュールに次のルートコードがあります。

'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'});
}]);

HomeCtrl、、AdminCtrlに共通の関数が欲しいMainAppCtrl

AngularJSでどのように行う必要がありますか?

4

2 に答える 2

63

Angularで共通コードを定義する方法は、サービスを使用することです。

次のように新しいサービスを定義します。

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

あなたのコントローラーであなたはこのサービスを注入するでしょう..そのように

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

コントローラー関数の引数としてCommonCodeを含めるだけです。Angularが自動的に注入します(ここで何が起こっているかを理解するには、依存関係の注入について読んでください)。

于 2012-07-04T09:34:57.307 に答える
9

以前の回答(これは何であるかを定義するだけです)を更新するために、AngularJSで依存性を注入する(共通コードを定義する)factory3つの方法があります:

  • プロバイダー
  • 工場
  • サービス

プロバイダーは依存性注入のより面倒な方法であるため、プロバイダーについてはあまり説明しません。ただし、このページでは、それらがどのように機能するかを非常によく説明しています。


技術的には、サービスファクトリは同じものに使用されます。結局のところ、サービスはコンストラクター関数ですが、ファクトリはそうではありません。

この投稿から:

module.service( 'serviceName', function );

serviceName注入可能な引数として宣言すると、関数のインスタンスが提供されます。

module.factory( 'factoryName', function );

factoryName注入可能な引数として宣言すると、 module.factoryに渡された関数参照を呼び出すことによって返される値が提供されます。


お好みのものを使用して、同じ結果を得ることができます。

これは、最初にまったく同じことを実行しservice、次にfactory

サービス構文

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

ファクトリ構文

app.factory('MyService', function () {
  return {
    sayHello: function () {
      console.log('hello');
    }
  }
});
于 2016-10-14T07:37:09.670 に答える