AngularJS DI(依赖注入)实现推测
AngularJS DI(依赖注入)
http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html
回到angularjs:在框架中为我们提供了angular.injector(modules)DI注入注射器。但是在我们使用注入的时候常常是不需要关心具体的如何注入。我们只需要按照其规则书写我们的angularjs代码就会很容易的得到angularjs的DI特性
1:推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定。angularjs会提取参数名称查找相应DI实例注入。
例如:
var myModule = angular.module('myModule', []);
myModule.factory('$alert', function($window) {
return {
alert: function(text) {
$window.alert(text);
}
};
});
var myController = function($scope, $alert) {
$scope.message = function(msg) {
console.log(msg);
$alert.alert(msg);
};
};
myModule.controller("myController", myController);
分析
控制器 myController 是一个函数, 其具有 $scope, $alert 两个参数,
这两个参数 第一个是APP应用域, 第二个是依赖的服务, 其实现为 myModule.factory 定义的 $alert 服务。
myController 控制器,在html 声明时候,被初始化, 即使被调用。如下HTML
<div ng-app="myModule" ng-controller="myController" ng-init="msg='test for alert'" >
<input ng-model="msg">
<button ng-click="message(msg);">click me</button>
<br/> {{msg}}
</div>
未见任何调用 myController 地方,如何控制入参传入? 且 $alert参数能对应到 myModule.factory 定义的 $alert 服务??
猜测是框架实现的调用流程,并将 服务注入到 myController 控制器, 当控制器被初始化时。
具体牵扯到JS函数定义具有自省性质, 使用toString方法,并将参数名解析出来, 然后到 服务列表中找到 参数名对应的服务, 然后调用 myController 方法。
JS的自省测试如下:
function test($scope, $alert) {console.log("aaa")}
test.toString().match(/\([^\(\)]*\)/)
["($scope, $alert)", index: 13, input: "function test($scope, $alert) {console.log("aaa")}", groups: undefined]0: "($scope, $alert)"groups: undefinedindex: 13input: "function test($scope, $alert) {console.log("aaa")}"length: 1__proto__: Array(0)
test.toString().match(/\([^\(\)]*\)/)[0]
"($scope, $alert)"
参考:
https://segmentfault.com/q/1010000002581288
AngularJS DI(依赖注入)实现推测的更多相关文章
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- DI依赖注入/IOC控制反转
DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...
- IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...
- Spring详解(三)------DI依赖注入
上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...
- Spring:(二)DI依赖注入方式
DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- 大话DI依赖注入+IOC控制反转(一) 之 定义
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转 依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...
- JAVAWEB 一一 Spirng(框架,IOC控制反转,DI依赖注入)
jar包 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...
随机推荐
- 英语口语练习系列-C16-钱
词汇学习 beer [bɪə(r)] n. 啤酒 a glass of beer 一杯啤酒 five glasses of beer 五杯啤酒 beers (种类) Shall we have a b ...
- RabbitMQ广播:direct模式
一. 消息的广播需要exchange:exchange是一个转发器,其实把消息发给RabbitMQ里的exchange fanout: 所有bind到此exchange的queue都可以接收消息,广播 ...
- CentOS 7 中使用NTP进行时间同步
1. NTP时钟同步方式说明NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服 ...
- python中的闭包和装饰器
重新学习完了函数,是时候将其中的一些重点重新捋一捋了,本次总结的东西只有闭包和装饰器 1.闭包 闭包是python函数中的一个比较重要功能,一般闭包都是用在装饰器上,一般学完闭包就会去学习装饰器,这俩 ...
- 三种dedecms友情链接调用标签
三种dedecms友情链接调用标签: 1.获取友情链接分类 {dede:flinktype}<span>[field:typename/]</span>{/dede:flink ...
- vue报错如log,如果其他项目运行没问题,很有可能是代码错误 加externals报错
- Python进阶2---树的遍历和堆排序
二叉树的遍历 堆排序Heap Sort 堆排序的过程 完整过程: #打印完整的二叉树 import math #打印完全二叉树,此函数非必要只是为了显示便利! def print_tree(lst): ...
- JS类型
1.查看类型 可以使用 typeof 操作符来检测变量的数据类型. typeof "John" // 返回 string typeof 3.14 // 返回 number type ...
- jzoj6101. 【GDOI2019模拟2019.4.2】Path
题目链接:https://jzoj.net/senior/#main/show/6101 记\(f_i\)为从\(i\)号点走到\(n\)号点所花天数的期望 那么根据\(m\)条边等可能的出现一条和一 ...
- 【BZOJ5503】[GXOI/GZOI2019]宝牌一大堆(动态规划)
[BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(d ...