Angular 9,有什么新功能?


在史蒂芬·弗林(Stephen Fluin)传统上发布新版本以及有关新Angular功能的文章之前,我一直试图将所有内容放在一起并回答新功能的问题?


我们等待了将近2年的最酷功能之一是Angular Ivy,最终Angular 9将默认使用Ivy进行编译。 如果您想深入探究Angular Ivy的内部,可以从AngularConnect获得2个视频:关于CompilerRuntime


与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的更多新闻。

Source: https://habr.com/ru/post/zh-CN481100/


All Articles