一段会报错的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的原理的更多相关文章

  1. angular的多个模块执行 angular里 字符串与对象的互转

    1.disable : true ,禁用 2.$timeout 计时器 $interval.cancel(timer); 3.app.run();  可以不使用控制器就开启数据,但适合$rootsco ...

  2. angular里使用vue/vue组件怎么在angular里用

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...

  3. 第217天:深入理解Angular双向数据绑定的原理

    一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...

  4. $.ajax 的速度要快于 angular 里 $http (个别情况)

    $.ajax: $http:

  5. angular里forRoot的作用

    模块A是这样定义的 @NgModule({ providers: [AService], declarations: [ TitleComponent ], exports: [ TitleCompo ...

  6. Angular里使用(image-compressor.js)图片压缩

    参考资料: http://www.imooc.com/article/40038 https://github.com/xkeshi/image-compressor 示例代码: <nz-upl ...

  7. GCD: 求两数最大公因数算法【欧几里得法】原理的个人理解 (80%图片讲解!)

    那么,求 a,b 的最大公因数就是求最大的,能均分a,b的块!  

  8. angular原理及模块简介

    Angular简介(大神可略过) Angular是一个强大的前端框架,其强大之处主要是可以把静态页面与动态数据绑定起来.平时我们看到的网页界面上面的数据都是固定,但如果我们要变化这些数据,例如我在一个 ...

  9. 30行代码让你理解angular依赖注入:angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...

随机推荐

  1. Linux磁盘和文件系统知识总结

    硬盘操作 为什么要给硬盘分区? 如果你需要在一块硬盘上用到多个文件系统,那么你就需要对硬盘进行分区,以便用不同的分区支持不同的文件系统.(但一个硬盘只能有一个分区表!)反过来说,如果你整块硬盘都用同样 ...

  2. React 与 Hooks 如何使用 TypeScript 书写类型?

    React 与 Hooks 如何使用 TypeScript 书写类型? 本文写于 2020 年 9 月 20 日 函数组件与 TS 对于 Hooks 来说是不支持使用 class 组件的. 如何在函数 ...

  3. SpringBoot Redis 实践指南

    前言 SpringBoot Cache 是一个很好的缓存框架,可以兼容多种缓存实现,数据量较大的情况下,Redis 应该是最多被使用的. 本文重点介绍 SpringBoot 和 Redis 整合使用的 ...

  4. Spring-Batch将CSV文件转为XML文件

    1 介绍 用Spring Batch实现一个简单的需求,将csv文件转换成xml文件. csv文件如下:record.csv username, user_id, transaction_date, ...

  5. Spring Boot下Spring Batch入门实例

    一.About Spring Batch是什么能干什么,网上一搜就有,但是就是没有入门实例,能找到的例子也都是2.0的,看文档都是英文无从下手~~~,使用当前最新的版本整合网络上找到的例子. 关于基础 ...

  6. linux篇-基于域名的apache服务器

    1承接上个博客说的,咱们继续扩展 Cd /usr/local/apache2/conf /usr/local/apache2/conf/extra扩展文件 Vi httpd-vhosts.conf & ...

  7. 斯坦福NLP课程 | 第18讲 - 句法分析与树形递归神经网络

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  8. 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等

    温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...

  9. 用python解决打标签时将xml文件的标签名打错

    用python解决打标签时将xml文件的标签名打错 问题描述:再进行达标签时将magnetic_tile的标签名错误的打成了magnetic_title,又不想一张一张的修改 出现问题的xml文件 & ...

  10. Go微服务框架go-kratos实战02:proto 代码生成和编码实现步骤

    在上一篇 kratos quickstart 文章中,我们直接用 kratos new 命令生成了一个项目. 这一篇来看看 kratos API 的定义和使用. 一.kratos 中 API 简介 1 ...