个性化阅读
专注于IT技术分析

angularjs依赖注入

本文概述

AngularJS带有内置的依赖注入机制。它有助于你将应用程序划分为多种不同类型的组件,这些组件可以作为依赖项相互注入。

依赖注入是一种软件设计模式,用于指定组件如何获取其依赖关系。在这种模式下,为组件提供了相关性,而不是在组件内对其进行编码。

模块化应用程序可以更轻松地重用,配置和测试应用程序中的组件。以下是对象和组件的核心类型:

  • Factory
  • 服务
  • 提供者
  • 不变

这些对象和组件可以使用AngularJS Dependency Injection相互注入。


在AngularJS中,值是一个简单的对象。它可以是数字,字符串或JavaScript对象。它用于在运行和配置阶段在工厂,服务或控制器中传递值。

//define a module
var myModule = angular.module("myModule", []);
//create a value object and pass it a data. 
myModule.value("numberValue", 100);
myModule.value("stringValue", "abc");
myModule.value("objectValue", { val1 : 123, val2 : "abc"} );

在此,使用模块上的value()函数定义值。第一个参数指定值的名称,第二个参数是值本身。工厂,服务和控制器现在可以通过名称来引用这些值。

注入价值

要将值注入到AngularJS控制器函数中,请在定义值时添加具有相同参数的参数。

var myModule = angular.module("myModule", []);
myModule.value("numberValue", 100);
myModule.controller("MyController", function($scope, numberValue) {
 console.log(numberValue);
});

Factory

Factory是用于返回值的函数。当服务或控制器需要从工厂注入值时,它将按需创建值。它通常使用工厂函数来计算并返回值。

让我们来看一个示例,该模块在模块上定义一个工厂,并使用一个控制器来注入工厂创建的值:

var myModule = angular.module("myModule", []);
myModule.factory("myFactory", function() {
    return "a value";
});
myModule.controller("MyController", function($scope, myFactory) {
console.log(myFactory);
});

将价值注入工厂

要将值注入到AngularJS控制器函数中,请在定义值时添加具有相同参数的参数。

var myModule = angular.module("myModule", []);
myModule.value("numberValue", 100);
myModule.controller("MyController", function($scope, numberValue) {
 console.log(numberValue);
});

注意:不是注入的工厂功能,而是工厂功能产生的值。


服务

在AngularJS中,服务是一个JavaScript对象,其中包含一组执行某些任务的函数。服务是通过在模块上使用service()函数创建的,然后注入到控制器中。

//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service which defines a method square to return square of a number.
mainApp.service('CalcService', function(MathService){
   this.square = function(a) {
      return MathService.multiply(a, a); 
   }
});
//inject the service "CalcService" into the controller
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);
   }
});

提供者

在AngularJS中,provider在配置阶段(AngularJS自我引导的阶段)内部用于创建服务,工厂等。这是你可以创建的最灵活的工厂形式。 Provider是带有get()函数的特殊工厂方法,用于返回值/服务/工厂。

//define a module
var mainApp = angular.module("mainApp", []);
...
//create a service using provider which defines a method square to return square of a number.
mainApp.config(function($provide) {
   $provide.provider('MathService', function() {
      this.$get = function() {
         var factory = {};  
         factory.multiply = function(a, b) {
            return a * b; 
         }
         return factory;
      };
   });
});

常数

你不能将值注入module.config()函数。相反,常量用于在配置阶段传递值。

mainApp.constant("configParam", "constant value");

让我们以一个示例来部署上述所有指令。

<!DOCTYPE html>
<html>
   <head>
      <title>AngularJS Dependency Injection</title>
   </head>
   <body>
      <h2>AngularJS Sample Application</h2>
      
      <div ng-app = "mainApp" ng-controller = "CalcController">
         <p>Enter a number: <input type = "number" ng-model = "number" /></p>
         <button ng-click = "square()">X<sup>2</sup></button>
         <p>Result: {{result}}</p>
      </div>
      
      <script src = "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/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", 10);
         
         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>
赞(0)
未经允许不得转载:srcmini » angularjs依赖注入

评论 抢沙发

评论前必须登录!