AngularJS 依存関係の注入



依存性注入とは何ですか

Wiki の説明は次のとおりです: 依存性注入 (DI) は、1 つ以上の依存関係 (またはサービス) を別のオブジェクト (またはクライアント) に注入 (または参照渡し) するソフトウェア設計パターンです。 )、クライアントの状態の一部になります。

このパターンでは、クライアント側の依存関係の動作の作成が分離され、プログラム設計が疎結合になり、依存関係の逆転と単一責任の原則に従います。サービス ロケーター パターンとはまったく対照的に、クライアントが依存関係を見つけるためにシステムをどのように使用するかをクライアントが理解できるようになります

一言で言えば --- 何もすることがないなら私のところに来ないでください、私が行きます何か用事があればあなたに。

AngularJS は優れた依存関係注入メカニズムを提供します。次の 5 つのコア コンポーネントが依存関係の注入として使用されます。

value
  • Value は単純な JavaScript オブジェクトです、コントローラーに値を渡すために使用されます (構成フェーズ):

    // 定义一个模块
    var mainApp = angular.module("mainApp", []);
    
    // 创建 value 对象 "defaultInput" 并传递数据
    mainApp.value("defaultInput", 5);
    ...
    
    // 将 "defaultInput" 注入到控制器
    mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
       $scope.number = defaultInput;
       $scope.result = CalcService.square($scope.number);
       
       $scope.square = function() {
          $scope.result = CalcService.square($scope.number);
       }
    });

  • factory
  • factory は、値を返すために使用される関数です。サービスとコントローラーによって必要に応じて作成されます。

  • 通常、値を計算したり返したりするにはファクトリー関数を使用します。
  • // 定义一个模块
    var mainApp = angular.module("mainApp", []);
    
    // 创建 factory "MathService" 用于两数的乘积 provides a method multiply to return multiplication of two numbers
    mainApp.factory('MathService', function() {
       var factory = {};
       
       factory.multiply = function(a, b) {
          return a * b
       }
       return factory;
    }); 
    
    // 在 service 中注入 factory "MathService"
    mainApp.service('CalcService', function(MathService){
       this.square = function(a) {
          return MathService.multiply(a,a);
       }
    });
    ...

    provider
  • AngularJS のプロバイダーを通じてサービス、ファクトリーなどを作成します (構成フェーズ)。

    プロバイダーは、値/サービス/ファクトリーを返すために使用されるファクトリーメソッド get() を提供します。
  • // 定义一个模块
    var mainApp = angular.module("mainApp", []);
    ...
    
    // 使用 provider 创建 service 定义一个方法用于计算两数乘积
    mainApp.config(function($provide) {
       $provide.provider('MathService', function() {
          this.$get = function() {
             var factory = {};  
             
             factory.multiply = function(a, b) {
                return a * b; 
             }
             return factory;
          };
       });
    });
  • constant

  • constant (定数) は、構成フェーズ中に値を渡すために使用されます。この定数は構成フェーズでは使用できないことに注意してください。
mainApp.constant("configParam", "constant value");

次の例は、上記の依存関係注入メカニズムのデモンストレーションを提供します。

インスタンス

<html>
   
   <head>
      <meta charset="utf-8">
      <title>AngularJS  依赖注入</title>
   </head>
   
   <body>
      <h2>AngularJS 简单应用</h2>
      
      <div ng-app = "mainApp" ng-controller = "CalcController">
         <p>输入一个数字: <input type = "number" ng-model = "number" /></p>
         <button ng-click = "square()">X<sup>2</sup></button>
         <p>结果: {{result}}</p>
      </div>
      
      <script src="//cdn.bootcss.com/angular.js/1.4.6/angular.min.js"></script>
      
      <script>
         var mainApp = angular.module("mainApp", []);
         
         mainApp.config(function($provide) {
            $provide.provider('MathService', function() {
               this.$get = function() {
                  var factory = {};
                  
                  factory.multiply = function(a, b) {
                     return a * b;
                  }
                  return factory;
               };
            });
         });
			
         mainApp.value("defaultInput", 5);
         
         mainApp.factory('MathService', function() {
            var factory = {};
            
            factory.multiply = function(a, b) {
               return a * b;
            }
            return factory;
         });
         
         mainApp.service('CalcService', function(MathService){
            this.square = function(a) {
               return MathService.multiply(a,a);
            }
         });
         
         mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
            $scope.number = defaultInput;
            $scope.result = CalcService.square($scope.number);

            $scope.square = function() {
               $scope.result = CalcService.square($scope.number);
            }
         });
			
      </script>
      
   </body>
</html>


インスタンスの実行 »

「インスタンスの実行」ボタンをクリックしてオンラインインスタンスを表示します