
在史蒂芬·弗林(Stephen Fluin)传统上发布新版本以及有关新Angular功能的文章之前,我一直试图将所有内容放在一起并回答新功能的问题?
我们等待了将近2年的最酷功能之一是Angular Ivy,最终Angular 9将默认使用Ivy进行编译。 如果您想深入探究Angular Ivy的内部,可以从AngularConnect获得2个视频:关于Compiler和Runtime 。
与Angular CLI一样,您可以轻松地进行升级,这是一个详细的指南 。
模板类型检查
除了fullTemplateTypeCheck之外,还将添加strictTemplates标志,它仅在Ivy中有效。 在完全模式下将是:
检查组件和指令与@Input
检查时,将检查打字稿strictNullChecks
检查组件类型和指令,包括通用
在执行上下文中检查模板,例如,在* ngFor内部
检查事件的类型$组件和指令中的事件,以及动画时
检查DOM元素的本地引用的正确类型,例如,当document.createElement返回标签时
在模板中进行了如此严格的类型检查后,有时需要禁用此检查,因此我们想出了$ any()不会执行检查的地方。
示例:{{$ any(person).addresss.street}}
@ContentChildren
默认情况下, ContentChild仅适用于直接子级
<comp> <div #bar> <!-- new runtime --> <div #foo></div> <!-- matches in old runtime --> </div> </comp>
为此,您将需要剪切标志后代
@ ContentChildren ('foo',{ 后代 :false})foos: QueryList < ElementRef >
DI
所有使用Angular DI的类都必须具有Angular装饰器,例如@Directive()
或@Injectable
(以前,未经修饰的类仅在AOT模式下允许使用,或者通过Inject使用)。 默认情况下,CLI应该正确升级它们。
至:
export class MyService {...} export class MyOtherService {...} export class MyThirdClass {...} export class MyFourthClass {...} export class MyFifthClass {...} @NgModule({ providers: [ MyService, {provide: SOME_TOKEN, useClass: MyOtherService},
之后:
@Injectable() export class MyService {...} @Injectable() export class MyOtherService {...} export class MyThirdClass {...} export class MyFourthClass {...} export class MySixthClass {...}
至:
{provide: MyToken}
之后:
{provide: MyToken, useValue: undefined}
现在,在更改检测之前创建视图时就设置了指令的输入(例如,<my-comp name =“”>中的名称)(以前它们都是在更改检测期间设置的)。
一些更有趣
可以继承@Component
和@Directive
host之@Component
属性(以前仅继承具有显式字段的属性,如@HostBinding)。
HammerJS支持通过HammerModule导入提供(以前,无论应用程序是否使用HammerJS,它始终包含在工作包中)。
如果使用@Host
或@Self
注入令牌,则模块注入器不会搜索此令牌(以前,标记有这些标志的令牌仍将在模块级别搜索)。
当访问具有相同名称的模板中的多个本地链接时,将采用第一个(较早采用最后一个实例)。
导出模块中使用的指令(但不是自己导出)是公开导出的(以前,编译器会自动记录带有别名的私有导出,以便它可以使用其全局知识来解决冲突)
装饰器元数据中的外部函数或外部常量不是静态可解析的(以前,您可以从另一个已编译模块(例如,从库中)导入常量或函数,然后在@NgModule
定义中使用此常量/函数)。
默认情况下,不再支持可通过本地链接访问的指令中的直接输入引用。
如果存在不相关的类属性并通过[class]进行绑定,则还将添加不相关属性的类(以前,通过该类进行的绑定重写了unbound属性中的类)。
不再可能在指令实例上使用模拟覆盖生命周期挂钩以进行测试(为此,请更改指令本身的生命周期挂钩)。
特殊注入令牌(例如TemplateRef或ViewContainerRef)每当被请求时都会返回一个新实例(以前,如果实例是从相似节点请求的,则被翻炒)。 这主要影响比较这些对象身份的测试。
ICU解析在运行时发生,因此仅允许文本,HTML标记和文本绑定器(以前,ICU表达式中也允许使用伪指令)。
不推荐使用
此处显示了对API的重大更改,并且已弃用的内容将被删除。
删除过时的API
如果这还不够,那就还有更多 。
好吧,我们预计圣诞节假期后会发布Angular 9 =):
仅供参考,我决定将#Angular 9.0版本保留到明年,以便我们所有人和您都可以在接下来的几周内休息。 节日快乐,2020年再见!
当然,请订阅@ngFanatic电报中的频道,该频道将发布有关Angular的更多新闻。