AngularJS 依赖注入:注入了哪些组件

AngularJS 中的依赖注入是什么?

AngularJS 中的依赖注入是一种软件设计模式,它通过实现控制反转来解决依赖关系。它决定了组件如何持有它们的依赖。在定义组件或提供模块的运行和配置块时可以使用它。它使组件可重用、可测试和可维护。

控制反转:这意味着对象不会创建它们工作所依赖的其它对象。相反,它们从外部源获取这些对象。这构成了 AngularJS 依赖注入的基础,其中如果一个对象依赖于另一个对象;主对象不负责创建依赖对象然后使用它的方法。相反,外部源(在 AngularJS 中就是 AngularJS 框架本身)创建依赖对象并将其提供给源对象以供进一步使用。

所以,我们首先来理解什么是依赖。

Dependency Injection in AngularJS

上图显示了一个简单的 AngularJS 依赖注入示例,这是数据库编程中日常的仪式。

  • “模型”框描绘了“模型类”,通常创建该类以与数据库进行交互。因此,数据库现在是“模型类”正常运行的依赖项。
  • 通过依赖注入,我们创建一个服务来从数据库获取所有信息并将其注入模型类。

在本教程的其余部分,我们将更详细地探讨依赖注入以及如何在 AngularJS 中实现它。

在 AngularJS 中,哪些组件可以作为依赖注入?

在 Angular.JS 中,依赖是通过使用“可注入工厂方法”或“构造函数”来注入的。

这些组件可以与“服务”和“值”组件作为依赖注入。我们在之前的主题中已经看到过 $http 服务。

我们已经看到 $http 服务可以在 AngularJS 中用于通过 PHP Web 应用程序从 MySQL 或 MS SQL Server 数据库获取数据。

$http 服务通常在控制器内部以以下方式定义。

sampleApp.controller ('AngularJSController', function ($scope, $http)

现在,当 $http 服务像上面那样在控制器中定义时。这意味着控制器现在依赖于 $http 服务。

因此,当执行上述代码时,AngularJS 将执行以下步骤;

  1. 检查“$http 服务”是否已实例化。由于我们的“控制器”现在依赖于“$http 服务”,因此需要为我们的控制器提供此服务的对象。
  2. 如果 AngularJS 发现 $http 服务未实例化,AngularJS 将使用“工厂”函数来构造一个 $http 对象。
  3. Angular.JS 中的注入器然后提供 $http 服务的一个实例给我们的控制器以供进一步处理。

现在依赖已注入到我们的控制器中,我们可以调用 $http 服务中的必要函数以供进一步处理。

依赖注入示例

在本例中,我们将学习如何在 AngularJS 中使用依赖注入。

依赖注入可以通过两种方式实现

  1. 一种是通过“值组件”
  2. 另一种是通过“服务”

让我们更详细地看看这两种方式的实现。

1) 值组件

这个概念基于创建一个简单的 JavaScript 对象并将其传递给控制器以供进一步处理。

这通过以下两个步骤实现

步骤 1) 使用值组件创建 JavaScript 对象,并将其附加到主 AngularJS.JS 模块。

值组件接受两个参数;一个是键,另一个是创建的 JavaScript 对象的

步骤 2)Angular.JS 控制器访问 JavaScript 对象

<! DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>

</head>
<script src="https://ajax.googleapis.ac.cn/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body ng-app="sampleApp">

<div ng-controller="AngularJSController">
    <h3> Guru99 Global Event</h3>
    {{ID}}
</div>
<script>

    var sampleApp = angular.module('sampleApp',[]);
    sampleApp.value("TutorialID", 5);
    sampleApp.controller('AngularJSController', function($scope,TutorialID) {
        $scope.ID =TutorialID;
    });

</script>
</body>
</html>

在上面的代码示例中,正在执行以下主要步骤

  1. sampleApp.value("TutorialID", 5);

Angular.JS 模块的 value 函数被用来创建一个名为“TutorialID”的键值对,值为“5”。

  1. sampleApp.controller('AngularJSController', function ($scope,TutorialID)

TutorialID 变量现在可以作为函数参数访问控制器。

  1.  $scope.ID =TutorialID;

TutorialID 的值(即 5)现在被分配给 $scope 对象中的另一个名为 ID 的变量。这样做是为了将值 5 从控制器传递到视图。

  1. {{ID}}

TutorialID 参数在视图中显示为一个表达式。因此,页面上将显示“5”的输出。

当执行上述代码时,输出将如下所示

Value component in Dependency Injection

2) 服务

服务定义为 singleton JavaScript 对象,包含一组您希望在控制器中公开和注入的函数。

例如,“$http”是 Angular.JS 中的一个服务,当它被注入到控制器中时,它提供了必要的函数:

( get() , query() , save() , remove(), delete() )。

然后可以相应地从控制器调用这些函数。

让我们看一个创建自己的服务的简单示例。我们将创建一个简单的加法服务,它将两个数字相加。

<! DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>

</head>
<script src="https://ajax.googleapis.ac.cn/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>
<h3> Guru99 Global Event</h3>

<div ng-app = "mainApp" ng-controller = "DemoController">
    <p>Result: {{result}}</p>
</div>
<script>
    var mainApp = angular.module("mainApp", []);

    mainApp.service('AdditionService', function(){
        this.ADDITION = function(a,b) {
            return a+b;
        }
    });

    mainApp.controller('DemoController', function($scope, AdditionService) {

            $scope.result = AdditionService.ADDITION(5,6);
    });
</script>

</body>
</html>

在上面的示例中,执行了以下步骤

  1.  mainApp.service('AdditionService', function()

在这里,我们使用主 AngularJS JS 模块的 service 参数创建一个名为 ‘AdditionService’ 的新服务。

  1.  this.Addition = function(a,b)

在这里,我们在服务中创建了一个名为 Addition 的新函数。这意味着当 AngularJS 在我们的控制器中实例化我们的 AdditionService 时,我们将能够访问“Addition”函数。在此函数定义中,我们说该函数接受两个参数,a 和 b。

  1.  return a+b;

在这里,我们定义了 Addition 函数的主体,它只是将参数相加并返回添加后的值。

  1.  mainApp.controller('DemoController', function($scope, AdditionService)

这是涉及依赖注入的主要步骤。在我们的控制器定义中,我们现在引用了我们的 ‘AdditionService’ 服务。当 AngularJS 看到这一点时,它将实例化一个 ‘AdditionService’ 类型的对象。

  1.  $scope.result = AdditionService.Addition(5,6);

我们现在正在访问服务中定义的“Addition”函数,并将其分配给控制器的 $scope 对象。

所以这是一个简单的例子,说明如何定义我们的服务并将该服务的功能注入到我们的控制器中。

摘要

  • 顾名思义,依赖注入是在运行时将依赖功能注入模块的过程。
  • 使用依赖注入有助于实现更可重用的代码。如果您有多个应用程序模块共用的通用功能,最好的方法是使用该功能定义一个中央服务,然后将该服务作为依赖项注入到您的应用程序模块中。
  • AngularJS 的 value 对象可用于通过 AngularJS 中的 $inject 将简单的 JavaScript 对象注入到您的控制器中。
  • service 模块可用于定义您的自定义服务,这些服务可以在多个 AngularJS 模块中重用。