angular里forwardRef的原理
一段会报错的angular代码
@Injectable()
class Socket {
constructor(private buffer: Buffer) { }
} console.log(Buffer); // undefined @Injectable()
class Buffer {
constructor(@Inject(BUFFER_SIZE) private size: Number) { }
} console.log(Buffer); // [Function: Buffer]
翻译一下
var providerList = new Map();
function Injectable(cls, deps) {
providerList.set(cls, {
deps: deps,
instance: null
});
} function inject(cls) {
var instanceObj = providerList.get(cls);
if (instanceObj === undefined) {
return null;
} else if (instanceObj.instance === null) {
var deps = instanceObj.deps.map(dep => inject(dep));
var instance = cls.apply({}, deps);
instanceObj.instance = instance;
return instance;
} else {
return instanceObj.instance;
}
} var Socket = (function() {
function Socket(buffer) {
this.buffer = buffer;
return this;
}
Injectable(Socket, [Buffer]);
return Socket;
}()); var Buffer = (function () {
function Buffer() {
this.sayHello = function() {
console.log('hello, i am Buffer.');
}
return this;
}
Injectable(Buffer, []);
return Buffer;
}()); var socket = inject(Socket);
socket.buffer.sayHello();
Socket被注入的时候,他的依赖Buffer还是undefined状态,最后取出来的就是undefined.
看看angular怎么用forwardRef解决这个问题的
@Injectable()
class Socket {
constructor(@Inject(forwardRef(() => Buffer) private buffer) { }
} @Injectable()
class Buffer {
constructor() { }
}
翻译一下
function forwardRef(forwardRefFn) {
forwardRefFn.__forward_ref__ = forwardRef;
return forwardRefFn;
}
function resolveForwardRef(type) {
if (typeof type === 'function' && type.hasOwnProperty('__forward_ref__') && type.__forward_ref__ === forwardRef) {
return type();
} else {
return type;
}
}
var providerList = new Map();
function Injectable(cls, deps) {
providerList.set(cls, {
deps: deps,
instance: null
});
}
function inject(cls) {
cls = resolveForwardRef(cls);
var instanceObj = providerList.get(cls);
if (instanceObj === undefined) {
return null;
} else if (instanceObj.instance === null) {
var deps = instanceObj.deps.map(dep => inject(dep));
var instance = cls.apply({}, deps);
instanceObj.instance = instance;
return instance;
} else {
return instanceObj.instance;
}
}
var Socket = (function() {
function Socket(buffer) {
this.buffer = buffer;
return this;
}
Injectable(Socket, [forwardRef(() => Buffer)]);
return Socket;
}());
var Buffer = (function () {
function Buffer() {
this.sayHello = function() {
console.log('hello, i am Buffer.');
}
return this;
}
Injectable(Buffer, []);
return Buffer;
}());
var socket = inject(Socket);
socket.buffer.sayHello();
原理就是依赖不再是类了,而是一个返回类的函数,这样在inject的时候避免注入undefined。
angular里forwardRef的原理的更多相关文章
- angular的多个模块执行 angular里 字符串与对象的互转
1.disable : true ,禁用 2.$timeout 计时器 $interval.cancel(timer); 3.app.run(); 可以不使用控制器就开启数据,但适合$rootsco ...
- angular里使用vue/vue组件怎么在angular里用
欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...
- 第217天:深入理解Angular双向数据绑定的原理
一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...
- $.ajax 的速度要快于 angular 里 $http (个别情况)
$.ajax: $http:
- angular里forRoot的作用
模块A是这样定义的 @NgModule({ providers: [AService], declarations: [ TitleComponent ], exports: [ TitleCompo ...
- Angular里使用(image-compressor.js)图片压缩
参考资料: http://www.imooc.com/article/40038 https://github.com/xkeshi/image-compressor 示例代码: <nz-upl ...
- GCD: 求两数最大公因数算法【欧几里得法】原理的个人理解 (80%图片讲解!)
那么,求 a,b 的最大公因数就是求最大的,能均分a,b的块!
- angular原理及模块简介
Angular简介(大神可略过) Angular是一个强大的前端框架,其强大之处主要是可以把静态页面与动态数据绑定起来.平时我们看到的网页界面上面的数据都是固定,但如果我们要变化这些数据,例如我在一个 ...
- 30行代码让你理解angular依赖注入:angular 依赖注入原理
依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...
随机推荐
- Mysql数据库基础_复习思维导图
Mysql复习的一个小总结,用xmind写的.(字数没有都不给我发博客) 下面是一些备注 子查询 MySQL子查询称为内部查询,而包含子查询的查询称为外部查询. 子查询可以在使用表达式的任何地方使用, ...
- C Primer Plus 学习笔记 -- 前六章
记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...
- 接口测试使用Python装饰器
写接口case时,有时需要对cae做一些共性的操作,最典型的场景如:获取case执行时间.打印log等. 有没有一种办法来集中处理共性操作从而避免在每个case中都写相同的代码(如:每个case都需要 ...
- CSAPP 之 AttackLab 详解
前言 本篇博客将会介绍 CSAPP 之 AttackLab 的攻击过程,利用缓冲区溢出错误进行代码注入攻击和 ROP 攻击.实验提供了以下几个文件,其中 ctarget 可执行文件用来进行代码注入攻击 ...
- 渗透:aircrack-ng
ircrack- NG是一个完整的工具来评估Wi-Fi网络安全套件,功能包括: 监控:数据包捕获和导出数据到文本文件,以供第三方工具进一步处理. 攻击:通过数据包注入回放攻击,去认证,伪造接入点等. ...
- linux篇-centos7.3配置
Centos7.3防火墙配置 1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启 ...
- 个人冲刺(四阶段)——体温上报app(一阶段)
任务:完成了后台数据库的类模块 MyDBHelper.java package com.example.helloworld; import android.content.Context; impo ...
- springcloud-- Alibaba-nacos--支持的几种服务消费方式
通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...
- C++编码规范(本人自定义)
C++编码规范 1.变量名用camelCase命名法(即lowerCamelCase,小驼峰拼写法)命名. 即小写字母开头,如果变量名是复合词,第二个单词的首字母大写. 举例: int digitsC ...
- Centos免密登陆
证书登录: 这里说的证书其实就是密钥. 在非对称加密中, 密钥分为公钥和私钥. 私钥, 即密钥所有人持有. 公钥则公布给他人. 公钥和私钥成对使用, 互相解密. 公钥加密数据只能用私钥解密; 私钥加密 ...