2019独角兽企业重金招聘Python工程师标准>>>

动态组件

问题1:动态组件和我们写的ngIf选择器有啥区别并且优势在哪里?

模板选择器直接实例化组件:

解释:根据已创建的组件工厂进行组件实例化,无须动态生成宿主元素(标签)

动态组件(工厂模式实例化组件)

解释:根据已经声明的组件(静态类d.ts)创建组件工厂再进行组件实例化,宿主元素(标签)通过Host文件生成

答:

先说场景:

(1)NG官网的例子一个广告位需要多个不同布局的页面进行切换,如果用ngIf,你就只能写死多个模板在父组件里(静态)。

(2)tab页切换,可以用上图动态组件生成的例子;(scm系统和wms系统的tab页看上去是路由锚点控制页面切换,但实际也是披着动态组件的羊毛)

两者对比:

(1)展现方面:没任何差别

(2)工作量:两者其实没什么差别,但同在一个父组件下基本都是传相同的参数值,那么你宁愿一个个写在模板上,还是写在方法里一劳永逸?

(3)性能:ngIf——我第一时间就想到了ngIf带来的注释模板,页面的变化都要进行变化检测,模板有多个ngIf模板就会多次判断(强行解释);其次这种懒加载方式能减少bundle的体积,加快首屏渲染速度
    子问题1:enterComponents和声明组件区别? 答:declarations——通过模板的selector创建组件,即声明并创建;entryComponents——声明不创建,等到用的时候才通过离线模板编译器(OTC)根据entryComponents List的内容编译已声明的组件创建工厂,Angular使用entryComponents来启用“tree shaking”,即只编译项目中实际使用的组件,而不是编译所有在ngModule中声明但从未使用的组件,enterComponents在ng里有三种表现形式,

  • @NgModule.bootstrap里声明的启动组件,如AppComponent。
  • 在路由配置里引用的组件
  • 其他通过编程使用组件类型加载的动态组件 (angular2(4) 中动态创建模块和组件的两种方案)

扩展:

一句话分析这张图片:ng的组件都是通过工厂函数(ComponentFactory<comp>)实例化出来,ngFactory.js文件负责装载组件模板及变化检测代码片段等静态数据,变量早已经在编译过程前开辟好内存空间,一切渲染过程都是以此为媒介。剩下的就是coder的选择是否用动态组件的方式加载,如果选用动态组件方式必定经过entryComponents的记录,当页面要加载这个组件时会OTC编译声明好的组件同时创建ngFactory.js 和 _Host_[x].ngFactory.js,前者渲染页面(考虑IOS和Android)后者负责生成宿主元素,这个就是一个动态组件编译过程。

其他:动态组件考点不止这些,还有装饰器@XXX、元数据的传入可以参考 Implementing custom component decorator ,

typescript的decorator是如何被编译的

问题2:ng的依赖注入在软件开发解决什么?

答:依赖注入(Dependence Inject)是控制反转(Inversion of Control 后)的行为。

控制反转——好莱坞的法则:“don‘t call us, we‘ll call you”。

紧耦合,谁也不能缺少谁,对象或者模块间通过互new的形式存在

实际场景,复杂且不好管理。

引入第三方把相应的对象/类(ng以服务形式存在)统一管理,并按需注入

最后,达到解耦的理想状态

问题3:依赖注入不仅仅是调用服务,实战还有更多新玩法。

概念篇——1、创建服务过程选择@Injectable、@NgModule 还是 @Component ?

2、provider入口API及各种提供商(useClass比较常见,适用于内部固定,外部变化多。useFactory对于权限控制即时变更状态场景有用)

3、每个组件创建一个注入器实例,服务实例在应用中是注册多次还是仅有一次,是根据注入形式不同前者是@Component.provider后者是AppModule.provider (举例:多种编辑会话,每个组件需要一个特定的服务进行管理表单的新值和旧值,这种情况必须使用@Component.provider,你可以理解为AppModule.provider注册的就只有一个对象(单例),根模块的提供商是向下传递到有需要用到该服务的组件中,而@Component.provider是为每个组件实例化独立的服务)

实践篇——1、组件可以通过注入器,把自己注入到子组件上(服务=类)

2、类-接口写法{provider: virtual, useClass: realClass},为了节省内存,同时作为Token而存在

3、出现引用循环,立即想到[{ provide: Parent, useExisting: forwardRef(() => AlexComponent) }]

4、仅找上一级的注入器服务添加@Host() 在服务创建前写 @Host() private heroCache: HeroCacheService,防止服务没找到用@Optional()

疑问:angular既然选择了AOT编译,那么离线模板编译器(OTC)在客户端是以什么形式存在?代码片段?

动态组件模块相关文章

angular2(4) 中动态创建模块和组件的两种方案

[译] 关于 Angular 动态组件你需要知道的

Angular进阶:Angular编译机制(AOT、JIT)

Implementing custom component decorator

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

ioc-demo简单例子

转载于:https://my.oschina.net/u/2949632/blog/2052376

依赖注入和动态组件的WWH(What Why How)相关推荐

  1. .NET Core中的一个接口多种实现的依赖注入与动态选择

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个 ...

  2. Spring学习-理解IOC和依赖注入

    最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...

  3. 转《两个个很形象的依赖注入的比喻》

    何谓控制反转(IoC = Inversion of Control),何谓依赖注入(DI = Dependency Injection)?一直都半懂不懂,今天看到两个比喻,觉得比较形象. IoC,用白 ...

  4. 控制反转-依赖倒置-依赖注入

    控制反转:框架控制应用/组件 依赖倒置: 依赖注入:框架动态注入依赖关系到应用/组件 --------------------------------------------------------- ...

  5. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

  6. Angular 2 之七 依赖注入

    概述 Angular 2使用自己的依赖注入框架并采用构造注入方式,依赖注入分两个步骤: 1) 向injector注册Provider 2) 构造类时injector根据参数注入对应的实例. 如上图所示 ...

  7. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  8. PHP进阶学习之依赖注入与Ioc容器详解

    背景 在很多编程语言(例如java)开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,一旦有修改,牵扯的类会很多 ...

  9. 依赖注入 这样的坑游戏编程要谨慎

    1 IGame游戏公司的故事 1.1 讨论会 话说有一个叫IGame的游戏公司,正在开发一款ARPG游戏(动作&角色扮演类游戏,如魔兽世界.梦幻西游这一类的游戏).一般这类游戏都有一个基本的功 ...

最新文章

  1. 10年卖下28家AI公司 苹果的AI吸星大法!
  2. Java:RMI远程调用
  3. 分布式服务框架 Zookeeper(二)官方介绍
  4. IDEA 15款神级良心插件强烈推荐收藏,提高一倍工作效率!
  5. 创建Silverlight 1.0 開發環境
  6. 谈一个优秀的美工需要掌握哪些技能
  7. WebApp 里Meta标签大全
  8. linux修改网卡名(亲测有效)
  9. .NET轻量级任务管理类
  10. bash脚本切换管理员_开始为系统管理员使用Bash脚本
  11. java tinyradius使用_TinyRadius客户端java登录认证
  12. python怎么定义一个变量为空列表_python – 为什么一个类变量没有在列表理解中定义,但另一个是?...
  13. java的max函数比较三个数_java – 使用泛型创建返回较大函数的max函数
  14. CAM表含义及各层交换机介绍
  15. 值得收藏的UmiJS 教程
  16. TFS2010(Team Foundation Server)配置总结
  17. 程序员得浪漫--十款表白小程序 一个比一个浪漫 赶紧收藏起来吧!!!
  18. 隐马尔科夫模型 python 实现简单拼音输入法
  19. WIN11 EDGE设置IE(internet explore)兼容相关
  20. 继续啃书,包,触发器

热门文章

  1. 【Rust日报】 2020-02-25 KAS GUI 0.3 发布
  2. HYSBZ - 2038 小Z的袜子(hose) (莫队入门)
  3. jQuery获取兄弟元素的各种方法总结
  4. linux启动盘 initrd,Linux 初始 RAM 磁盘(initrd)概述
  5. 成都大运会「数智竞技邀请赛」启动,「开悟」平台为全球青年提供AI竞技舞台...
  6. 群晖设置存储空间和共享文件夹
  7. 云原生养成计划进行到哪一步了?
  8. 力扣让我心碎的第二天
  9. ftp共享文件夹设置说明
  10. CSS 强制不换行,文字溢出显示省略号~