参考地址:https://segmentfault.com/a/1190000008754631
本文宗旨:东一榔头西一棒子,零零散散提示点
- 性能优化:减少检测链长度,实现局部的变化检测,使用onpush策略
- ES5中,编译阶段,变量声明和函数声明会自动提升,而函数表达式不会自动提升。(原来js自己也有编译阶段);函数声明:function Animal(){}; 函数表达式:var Animal = function(){};
- ES6、Typescrip等转换成ES5,类会转换成函数表达式
- 基于上面原因,angular中使用forwardRef来解决依赖的先后定义问题(provider声明时用)
- OpaqueToken与InjectionToken出现的原因:解决token起名(字符串)的重复问题
- InjectionToken相比OpaqueToken的优势:避免用户使用OpaqueToken时忘记new Inject(opaqueTokenName)
- 在angular中,host代表宿主的意思。宿主代表指令等所在的元素。
- 指令分为:属性指令与结构指令,一个更改样式,一个更改结构
- ngTemplateOutlet就是 ngTemplate出口 的意思,它的值对应一个ngTemplate引用
- <ng-template> 用于定义模板
- <ng-container> 是一个逻辑容器
- 使用rxjs的防反跳debounceTime
- 随时记得取消订阅
- 所谓的模板变量就是指 #child
<child-component #child></child-component>
<button (click)="child.name = childName">设置子组件名称</button>
- 组件可以继承,但只能继承逻辑部分,像@component定义的元数据不能继承
- 组件通信的常用方式:@Input、@Output、@ViewChild、模板变量、MessageService、Broadcaster(后两个,本质上都是用的rxjs)
- 基于 [译] 关于
ExpressionChangedAfterItHasBeenCheckedError
错误你所需要知道的事情 的理解:为啥先更新所有子组件或指令的输入属性值,再执行他们的ngOnInit,OnChanges,ngDoCheck等方法呢?答:你不给人家传入参数,人家怎么知道如何初始化等一系列操作。 - 没有在模板中显示调用组件的,都要记得在entryComponents中声明,以让编译器将其编译。否则编译器会认为其是无用代码。
- 如果没有在模板中显示调用组件,又没有通过路由的形式实例化,就只能动态创建组件实例了,需要用到ComponentFactoryResolver
- 可以用<ng-container>进行逻辑分组,又不会产生dom节点