全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

AngularJS学习第二篇 AngularJS依赖注入

简介:

首先我们需要理解什么是依赖注入?
控制反转和依赖注入有什么区别?

假定:应用程序A,需要访问外部资源C。这里使用了容器B(是指用来实现 IOC/DI 功能的一个框架程序)。
A需要访问C
B获取C然后返回给A
IOC inversion of control 控制反转:站在容器角度。B控制A,由B反向的向A注入C。即容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
DI Dependency Injection 依赖注入:站在应用程序的角度。A依赖B获取C,B将C注入A。即应用程序依赖容器创建并注入它所需要的外部资源。

AngularJS依赖注入

Provider服务($provide)

AngularJS 提供很好的依赖注入机制。以下5个核心组件用来作为依赖注入:

value
factory
service
provider
constant
decorator (打酱油)

Constant

定义常量用的,这货定义的值当然就不能被改变,它可以被注入到任何地方,但是不能被装饰器(decorator)装饰

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.constant('movieTitle', 'The Matrix');
});
app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
});
// 语法糖:
app.constant('movieTitle', 'The Matrix');

Value

这货可以是string,number甚至function,它和constant的不同之处在于,它可以被修改,不能被注入到config中,但是它可以被decorator装饰

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.value('movieTitle', 'The Matrix')
});
app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
});
// 语法糖:
app.value('movieTitle', 'The Matrix');

Service

它是一个可注入的构造器,在AngularJS中它是单例的,用它在Controller中通信或者共享数据都很合适。

var app = angular.module('app' ,[]);
app.config(function ($provide) {
 $provide.service('movie', function () {
  this.title = 'The Matrix';
 });
});
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});
// 语法糖:
app.service('movie', function () {
 this.title = 'The Matrix';
});

Factory

它是一个可注入的function,它和service的区别就是:factory是普通function,而service是一个构造器(constructor),这样Angular在调用service时会用new关键字,而调用factory时只是调用普通的function,所以factory可以返回任何东西,而service可以不返回(可查阅new关键字的作用)。

var app = angular.module('app', []);
app.config(function ($provide) {
 $provide.factory('movie', function () {
  return {
   title: 'The Matrix';
  }
 });
}); 
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});
// 语法糖
app.factory('movie', function () {
 return {
  title: 'The Matrix';
 }
});

Provider

provider是他们的老大,上面的几乎(除了constant)都是provider的封装,provider必须有一个$get方法,当然也可以说provider是一个可配置的factory。

var app = angular.module('app', []);
app.provider('movie', function () {
 var version;
 return {
  setVersion: function (value) {
   version = value;
  },
  $get: function () {
   return {
     title: 'The Matrix' + ' ' + version
   }
  }
 }
});
app.config(function (movieProvider) {
 movieProvider.setVersion('Reloaded');
});
app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix Reloaded');
});

Decorator

这个比较特殊,它不是provider,它是用来装饰其他provider的,而前面也说过,他不能装饰Constant,因为实际上Constant不是通过provider()方法创建的。

var app = angular.module('app', []);
app.value('movieTitle', 'The Matrix');
app.config(function ($provide) {
 $provide.decorator('movieTitle', function ($delegate) {
  return $delegate + ' - starring Keanu Reeves';
 });
});
app.controller('myController', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});

总结:

所有的供应商都只被实例化一次,也就说他们都是单例的
除了constant,所有的供应商都可以被装饰器(decorator)装饰
value就是一个简单的可注入的值
service是一个可注入的构造器
factory是一个可注入的方法
decorator可以修改或封装其他的供应商,当然除了constant
provider是一个可配置的factory

上述来源:(AngularJS中的Provider们:Service和Factory等的区别)https://segmentfault.com/a/1190000003096933

注入器($injector)

注入器负责从我们通过 provide 创建的服务中创建注入的实例。只要你编写了一个带有可注入性的参数,你都能看到注入器是如何运行的。每一个 AngularJS 应用都有唯一一个 injector,当应用启动的时候它被创造出来,你可以通过将 injector 注入到任何可注入函数中来得到它($injector 知道如何注入它自己!)。
一旦你拥有了 injector,你可以动过调用 get 函数来获得任何一个已经被定义过的服务的实例。

var movie = $injector.get('movie');
expect(movie.title).toEqual('The Matrix Reloaded');

注入器同样也负责将服务注入到函数中;例如,你可以魔法般的将服务注入到任何函数中,只要你使用了注入器的 invoke 方法:

var myFunction = function(movie) {
 return movie.title;
};
$injector.invoke(myFunction);

如果注入器只是创建一个服务的实例一次的话,那么它也没什么了不起的。它的厉害之处在于,他能够通过服务名称缓存从一个 provider 中返回的任何东西,当你下一次再使用这个服务时,你将会得到同一个对象。
因此,你可以通过调用 injector.invike 将服务注入到任何函数中也是合情合理的了。包括:

  • 控制器定义函数
  • 指令定义函数
  • 过滤器定义函数
  • provider中的$get方法(也就是factory函数)

由于constant和value总是返回一个静态值,它们不会通过注入器被调用,因此你不能在其中注入任何东西。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# AngularJS  # 依赖注入  # angular 服务的单例模式(依赖注入模式下)详解  # 深入理解Angular中的依赖注入  # Angular 4依赖注入学习教程之InjectToken的使用(八)  # Angular 4依赖注入学习教程之ValueProvider的使用(七)  # AngularJS的依赖注入实例分析(使用module和injector)  # 自学实现angularjs依赖注入  # Angular.JS学习之依赖注入$injector详析  # AngularJS $injector 依赖注入详解  # 详解Angular依赖注入  # 是一个  # 你可以  # 应用程序  # 它是  # 它可以  # 都是  # 站在  # 只要你  # 所需要  # 商都  # 他们的  # 使用了  # 都有  # 很好  # 也就  # 将会  # 之处  # 可以说  # 是指  # 当你 


相关文章: 如何通过主机屋免费建站教程十分钟搭建网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  建站之星如何实现网站加密操作?  再谈Python中的字符串与字符编码(推荐)  教学网站制作软件,学习*后期制作的网站有哪些?  海南网站制作公司有哪些,海口网是哪家的?  Python路径拼接规范_跨平台处理说明【指导】  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  山东云建站价格为何差异显著?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站之星展会模板:智能建站与自助搭建高效解决方案  制作销售网站教学视频,销售网站有哪些?  如何获取上海专业网站定制建站电话?  如何用好域名打造高点击率的自主建站?  建站之星代理费用多少?最新价格详情介绍  制作公司内部网站有哪些,内网如何建网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速搭建FTP站点实现文件共享?  如何快速选择适合个人网站的云服务器配置?  存储型VPS适合搭建中小型网站吗?  定制建站策划方案_专业建站与网站建设方案一站式指南  如何高效搭建专业期货交易平台网站?  如何在建站之星网店版论坛获取技术支持?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何制作一个表白网站视频,关于勇敢表白的小标题?  ,南京靠谱的征婚网站?  高端云建站费用究竟需要多少预算?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  如何快速生成凡客建站的专业级图册?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  中山网站推广排名,中山信息港登录入口?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  企业微网站怎么做,公司网站和公众号有什么区别?  建站之星后台密码遗忘或太弱?如何重置与强化?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  广州商城建站系统开发成本与周期如何控制?  建站主机SSH密钥生成步骤及常见问题解答?  如何通过商城免费建站系统源码自定义网站主题?  建站OpenVZ教程与优化策略:配置指南与性能提升  长沙企业网站制作哪家好,长沙水业集团官方网站?  建站之星安装模板失败:服务器环境不兼容?  大连网站制作公司哪家好一点,大连买房网站哪个好?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  高防服务器如何保障网站安全无虞?  建站为何优先选择香港服务器?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站主机空间推荐 高性价比配置与快速部署方案解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。