ITPub博客

首页 > IT职业 > IT图书 > AngularJS之Dependency Injection

AngularJS之Dependency Injection

IT图书 作者:THUNDER2 时间:2021-09-09 09:14:01 0 删除 编辑

前言

这一节我们来讲讲AngularJS中的依赖注入,在实际开发中Angular提供了具体的方法供我们去调用,但是一旦业务不能满足要求或者出现麻烦或者错误时导致无从下手,所以基于此我们有必要深入一点去了解内部的基本原理,这样我们才能将Angular玩弄于鼓掌之间。

话题

在讲述依赖注入时我们有必要讲一讲一个组件decorator(暂且叫做装饰者)。它也是创建服务的一个例子。decorator是一种设计模式,它能隔离修改及在不修改源码的前提下进行修改。在Angular中,它能够在服务、指令、过滤器使用之前被修改。

我们应该如何去使用使用装饰者,我们有两种方法来注册装饰者 $provide.decorator 和 module.decorator 这两种都有一个 $delegate ,这个被用来初始化服务、过滤器、指令。我们主要介绍第一种注册装饰者的方法

$provide.decorator

我们看看在Angular中日志服务是怎么来的。

angular.module('myApp', [])

.config([ '$provide', function($provide) {

  $provide.decorator('$log', [
    '$delegate',
    function $logDecorator($delegate) {

      var originalWarn = $delegate.warn;
      $delegate.warn = function decoratedWarn(msg) {
        msg = 'Decorated Warn: ' + msg;
        originalWarn.apply($delegate, arguments);
      };

      return $delegate;
    }
  ]);
}]);

一旦日志服务被初始化后,装饰者(decorator)就会被触发,decorator函数有一个注入到访问在装饰者中匹配所选择的服务的delegate对象。" tabindex="0" id="MathJax-Element-1-Frame" class="MathJax">delegate对象。

delegate对象。" role="presentation">delegate对象。delegate是我们正在装饰的服务对象,提供装饰者返回的函数值将代替正在被装饰的服务、过滤器、指令。简单来讲,通过decorator我们能够在服务、过滤器或者指令使用之前进行适当的修改来满足我们所需,也就是说这是最原始实例化服务的方法,我们通过可以此方法来打补丁或者重写、修改等操作。在前面系列中我们讲了三种创建服务的方法,这节讲述怎样注册组件并且注入他们以此来解析依赖。

注册组件

通过provide服务来注册例如下面服务以至于他们能被注入来满足依赖。这些组件是通过" role="presentation">provide服务来注册例如下面服务以至于他们能被注入来满足依赖。这些组件是通过injector而注册(下面会讲),当我们请求一个服务时,通过injector来找到正确的serviceprovider。初始化服务提供者并通过调用" role="presentation">injector来找到正确的serviceprovider。初始化服务提供者并通过调用get工厂函数来获取服务实例。通过provide服务定义的许多服务方法被暴露在angular.module中。如下提供几个有用的通过" role="presentation">provide服务定义的许多服务方法被暴露在angular.module中。如下提供几个有用的通过provide服务定义的方法。

Name Descriptions
constant(name, value) 定义一个constant值
decorator(name, service) 定义一个服务decorator
factory(name, service) 定义一个服务
provider(name, service) 定义一个服务
service(name, provider) 定义一个服务
value(name, value) 定义一个值服务

如上除了decorator未被暴露在angular.module中,原因猜想大概是:由于是最原始的初始化服务的方法,所以在大部分情况下我们都不会用到,除非在特定情况下要进行某一目的的特定修改我们才需要,所以未进行显式的暴露。在这里我们有必要来演示下。我们在Angular原始日志服务基础上添加一点信息来进行打印。

界面代码如下:

                            

    

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3566/viewspace-2808797/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    74
  • 访问量
    520