-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchunk-DDuyRpY6.js
9 lines (7 loc) · 181 KB
/
chunk-DDuyRpY6.js
1
2
3
4
5
6
7
8
9
import {g}from'./chunk-Nwjx55rZ.js';import {d as D,e as an,Z as Se,D as Db,_ as st,a0 as nt$1,a1 as De,a2 as Se$1,a3 as Xe$1,U as UD,n as gl,o as ow,p as ml,a4 as Sh,O as OD,r as ag,L as LD,a5 as kD,X as Xh,a6 as rw,S as SI,b as Wh,C as dg,A as AD,F as FD,$ as $h,a7 as I,V,a8 as Tb,a9 as xu,aa as st$1,R as Rr,ab as r1,ac as oe$1,ad as li,ae as nt$2,af as z,ag as Br,ah as Mg,ai as Ke$1,aj as Fr,ak as pw,al as xy,am as i1,an as a1,ao as zD,N as ed,M as Xu,ap as dd,aq as fd,ar as ZD,J as zh,as as No,at as Qt,au as Ca,av as sg,E as ED,aw as JD,ax as KD,ay as XD,az as io,aA as le,aB as Nb,aC as S,aD as YD,aE as Xt,W as WD,aF as fg,aG as xn,aH as pe,aI as rI,aJ as ww}from'./main-CWMTBNLS.js';var e=function(n){return n[n.Basic=1]="Basic",n[n.Medium=2]="Medium",n[n.Advanced=3]="Advanced",n}(e||{}),ze=[{possibleIn:200,necessaryAsOf:400,level:e.Basic,step:"\u6269\u5C55 OnInit",action:"\u786E\u4FDD\u4E0D\u8981\u4F7F\u7528 `extends OnInit`\uFF0C\u6216\u8005\u5C06 `extends` \u4E0E\u4EFB\u4F55\u751F\u547D\u5468\u671F\u4E8B\u4EF6\u5408\u7528\u3002\u800C\u5E94\u8BE5\u4F7F\u7528 `implements <\u751F\u547D\u5468\u671F\u4E8B\u4EF6>`\u3002"},{possibleIn:200,necessaryAsOf:400,level:e.Advanced,step:"\u6DF1\u5C42\u5BFC\u5165",action:"\u505C\u6B62\u4F7F\u7528\u6DF1\u5C42\u5BFC\u5165\uFF0C\u8FD9\u4E9B\u7B26\u53F7\u73B0\u5728\u5DF2\u6807\u8BB0\u4E3A \u0275\uFF0C\u5E76\u4E0D\u662F\u6211\u4EEC\u516C\u5171 API \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:200,necessaryAsOf:400,level:e.Advanced,step:"invokeElementMethod",action:"\u505C\u6B62\u4F7F\u7528 `Renderer.invokeElementMethod`\uFF0C\u56E0\u4E3A\u8BE5\u65B9\u6CD5\u5DF2\u88AB\u79FB\u9664\u3002\u76EE\u524D\u6CA1\u6709\u66FF\u4EE3\u65B9\u6CD5\u3002"},{possibleIn:400,necessaryAsOf:400,level:e.Basic,step:"\u975E\u52A8\u753B\u6A21\u5757",action:"\u5982\u679C\u4F60\u7684\u5E94\u7528\u4E2D\u4F7F\u7528\u4E86\u52A8\u753B\uFF0C\u8BF7\u5728\u4F60\u7684\u5E94\u7528 `NgModule` \u4E2D\u4ECE `@angular/platform-browser/animations` \u5BFC\u5165 `BrowserAnimationsModule`\u3002"},{possibleIn:400,necessaryAsOf:400,level:e.Medium,step:"\u539F\u751F\u8868\u5355\u9A8C\u8BC1",action:"\u5F53\u4F60\u5305\u542B `FormsModule` \u65F6\uFF0CAngular \u5C31\u4F1A\u5F00\u59CB\u5411\u8868\u5355\u5143\u7D20\u6DFB\u52A0 `novalidate` \u5C5E\u6027\u3002\u8981\u91CD\u65B0\u542F\u7528\u539F\u751F\u8868\u5355\u884C\u4E3A\uFF0C\u8BF7\u4F7F\u7528 `ngNoForm` \u6216\u6DFB\u52A0 `ngNativeValidate`\u3002"},{possibleIn:400,necessaryAsOf:400,level:e.Advanced,step:"RootRenderer",action:"\u7528 `RendererFactoryV2` \u66FF\u6362 `RootRenderer`\u3002"},{possibleIn:400,necessaryAsOf:400,level:e.Advanced,ngUpgrade:true,step:"downgradeInjectable",action:"`upgrade/static/downgradeInjectable` \u7684\u8FD4\u56DE\u503C\u5DF2\u66F4\u6539\u3002"},{possibleIn:400,necessaryAsOf:400,level:e.Advanced,step:"\u52A8\u753B\u6D4B\u8BD5",action:"\u5982\u679C\u4F60\u4F7F\u7528\u4E86\u52A8\u753B\u548C\u6D4B\u8BD5\uFF0C\u8BF7\u5728\u4F60\u7684 `TestBed.initTestEnvironment` \u8C03\u7528\u4E2D\u6DFB\u52A0 `mods[1].NoopAnimationsModule`\u3002"},{possibleIn:200,necessaryAsOf:500,level:e.Advanced,step:"DefaultIterableDiffer",action:"\u505C\u6B62\u4F7F\u7528 `DefaultIterableDiffer`\u3001`KeyValueDiffers#factories` \u6216 `IterableDiffers#factories`\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Basic,step:"\u6A21\u677F\u6807\u7B7E",action:"\u5C06\u4F60\u7684 `template` \u6807\u7B7E\u91CD\u547D\u540D\u4E3A `ng-template`\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Medium,step:"OpaqueToken",action:"\u7528 `InjectionToken` \u66FF\u6362\u4EFB\u4F55 `OpaqueToken`\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Advanced,step:"DifferFactory",action:"\u5982\u679C\u8C03\u7528\u4E86 `DifferFactory.create(...)`\uFF0C\u5C31\u79FB\u9664 `ChangeDetectorRef` \u53C2\u6570\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Advanced,step:"ErrorHandler \u53C2\u6570",action:"\u505C\u6B62\u5411 ErrorHandler \u6784\u9020\u51FD\u6570\u4F20\u9012\u4EFB\u4F55\u53C2\u6570\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Advanced,step:"ngProbeToken",action:"\u5982\u679C\u4F7F\u7528\u4E86 ngProbeToken\uFF0C\u8BF7\u786E\u4FDD\u4ECE @angular/core \u800C\u4E0D\u662F @angular/platform-browser \u5BFC\u5165\u5B83\u3002"},{possibleIn:400,necessaryAsOf:500,level:e.Advanced,step:"TrackByFn",action:"\u5982\u679C\u4F7F\u7528\u4E86 TrackByFn\uFF0C\u6539\u7528 TrackByFunction\u3002"},{possibleIn:500,necessaryAsOf:500,level:e.Basic,step:"i18n \u7BA1\u9053\u66F4\u6539",action:"\u5982\u679C\u4F9D\u8D56\u4E8E\u65E5\u671F\u3001\u8D27\u5E01\u3001\u5C0F\u6570\u6216\u767E\u5206\u6BD4\u7BA1\u9053\uFF0C\u5728 5 \u4E2D\u5C06\u770B\u5230\u683C\u5F0F\u7684\u8F7B\u5FAE\u66F4\u6539\u3002\u5BF9\u4E8E\u4F7F\u7528\u5176\u4ED6\u533A\u57DF\u8BBE\u7F6E\u800C\u4E0D\u662F en-us \u7684\u5E94\u7528\u7A0B\u5E8F\uFF0C\u4F60\u9700\u8981\u5BFC\u5165\u5B83\uFF0C\u53EF\u9009\u62E9\u4ECE `@angular/common/i18n_data/locale_fr` \u5BFC\u5165 `locale_extended_fr` \u5E76\u6CE8\u518C locale\u3002"},{possibleIn:500,necessaryAsOf:500,level:e.Advanced,step:"gendir",action:'\u4E0D\u8981\u4F9D\u8D56\u4E8E `gendir`\uFF0C\u800C\u662F\u8003\u8651\u4F7F\u7528 `skipTemplateCodeGen`\u3002 <a href=https://github.com/angular/angular/issues/19339#issuecomment-332607471" target="_blank">\u9605\u8BFB\u66F4\u591A</a>'},{possibleIn:220,necessaryAsOf:600,level:e.Basic,ngUpgrade:true,step:"\u52A8\u6001 ngUpgrade",action:"\u7528 `@angular/upgrade/static` \u4E2D\u7684\u65B0\u7248\u672C\u66FF\u6362\u4ECE `@angular/upgrade` \u5BFC\u5165\u7684 `downgradeComponent`\u3001`downgradeInjectable`\u3001`UpgradeComponent` \u548C `UpgradeModule`\u3002"},{possibleIn:400,necessaryAsOf:600,level:e.Medium,step:"\u6838\u5FC3\u4E2D\u7684\u52A8\u753B",action:"\u5982\u679C\u4ECE @angular/core \u5BFC\u5165\u4E86\u4EFB\u4F55\u52A8\u753B\u670D\u52A1\u6216\u5DE5\u5177\uFF0C\u5E94\u8BE5\u4ECE @angular/animations \u5BFC\u5165\u3002"},{possibleIn:400,necessaryAsOf:600,level:e.Advanced,step:"ngOutletContext",action:"\u7528 `ngTemplateOutletContext` \u66FF\u6362 `ngOutletContext`\u3002"},{possibleIn:400,necessaryAsOf:600,level:e.Advanced,step:"collectionChangeRecord",action:"\u7528 `IterableChangeRecord` \u66FF\u6362 `CollectionChangeRecord`\u3002"},{possibleIn:400,necessaryAsOf:900,level:e.Advanced,step:"Renderer",action:"\u4EFB\u4F55\u4F7F\u7528 Renderer \u7684\u5730\u65B9\uFF0C\u73B0\u5728\u4F7F\u7528 Renderer2\u3002"},{possibleIn:400,necessaryAsOf:600,level:e.Advanced,step:"\u8DEF\u7531\u5668\u67E5\u8BE2\u53C2\u6570",action:"\u5982\u679C\u4F7F\u7528\u4E86 preserveQueryParams\uFF0C\u6539\u7528 queryParamsHandling\u3002"},{possibleIn:430,necessaryAsOf:800,level:e.Basic,step:"Http",action:"\u5982\u679C\u4F7F\u7528\u4F20\u7EDF\u7684 `HttpModule` \u548C `Http` \u670D\u52A1\uFF0C\u8BF7\u5207\u6362\u5230 `HttpClientModule` \u548C `HttpClient` \u670D\u52A1\u3002HttpClient \u7B80\u5316\u4E86\u9ED8\u8BA4\u7684\u4EBA\u4F53\u5DE5\u7A0B\u5B66\uFF08\u4F60\u4E0D\u518D\u9700\u8981\u6620\u5C04\u5230 JSON\uFF09\uFF0C\u73B0\u5728\u652F\u6301\u7C7B\u578B\u5316\u8FD4\u56DE\u503C\u548C\u62E6\u622A\u5668\u3002\u5728 [angular.dev](https://angular.io/guide/http) \u4E0A\u9605\u8BFB\u66F4\u591A\u3002"},{possibleIn:430,necessaryAsOf:600,level:e.Advanced,step:"@angular/platform-browser \u4E2D\u7684 DOCUMENT",action:"\u5982\u679C\u4F7F\u7528 @angular/platform-browser \u4E2D\u7684 DOCUMENT\uFF0C\u8BF7\u5F00\u59CB\u4ECE @angular/common \u5BFC\u5165\u3002"},{possibleIn:500,necessaryAsOf:600,level:e.Advanced,step:"ReflectiveInjector",action:"\u4EFB\u4F55\u4F7F\u7528 ReflectiveInjector \u7684\u5730\u65B9\uFF0C\u73B0\u5728\u4F7F\u7528 StaticInjector\u3002"},{possibleIn:500,necessaryAsOf:550,level:e.Medium,step:"\u7A7A\u767D\u5B57\u7B26",action:"\u5728\u4F60\u7684 `tsconfig.json` \u7684 `angularCompilerOptions` \u952E\u4E0B\u9009\u62E9 `off` \u4F5C\u4E3A `preserveWhitespaces` \u7684\u503C\uFF0C\u4EE5\u83B7\u5F97\u6B64\u8BBE\u7F6E\u7684\u597D\u5904\uFF0C\u8BE5\u8BBE\u7F6E\u5728 v6 \u4E2D\u9ED8\u8BA4\u8BBE\u7F6E\u4E3A `off`\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Basic,step:"Node 8",action:'\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528<a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 8\u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:false,step:"\u66F4\u65B0\u5230 CLI v6",action:'\u66F4\u65B0\u4F60\u7684 Angular CLI\uFF0C\u5E76\u5C06\u914D\u7F6E\u8FC1\u79FB\u5230<a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">\u65B0\u7684 angular.json \u683C\u5F0F</a>\uFF0C\u65B9\u6CD5\u5982\u4E0B\uFF1A<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/cli@6`<br/>'},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:true,step:"\u66F4\u65B0\u5230 CLI v6",action:'\u66F4\u65B0\u4F60\u7684 Angular CLI\uFF0C\u5E76\u5C06\u914D\u7F6E\u8FC1\u79FB\u5230<a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">\u65B0\u7684 angular.json \u683C\u5F0F</a>\uFF0C\u65B9\u6CD5\u5982\u4E0B\uFF1A<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/>'},{possibleIn:600,necessaryAsOf:600,level:e.Medium,step:"CLI v6 \u811A\u672C",action:"\u66F4\u65B0\u4F60\u5728 `package.json` \u4E2D\u53EF\u80FD\u6709\u7684\u4EFB\u4F55 `scripts`\uFF0C\u4EE5\u4F7F\u7528\u6700\u65B0\u7684 Angular CLI \u547D\u4EE4\u3002\u6240\u6709 CLI \u547D\u4EE4\u73B0\u5728\u4F7F\u7528\u4E24\u4E2A\u77ED\u6A2A\u7EBF\u4F5C\u4E3A\u6807\u5FD7\uFF08\u4F8B\u5982 `ng build --prod --source-map`\uFF09\u4EE5\u7B26\u5408 POSIX \u89C4\u8303\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:false,step:"\u66F4\u65B0\u5230 Angular v6",action:"\u5C06\u4F60\u7684\u6240\u6709 Angular \u6846\u67B6\u5305\u66F4\u65B0\u5230 v6\uFF0C\u5E76\u6B63\u786E\u5B89\u88C5 RxJS \u548C TypeScript \u7684\u7248\u672C\u3002<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/core@6`<br/><br/>\u66F4\u65B0\u540E\uFF0CTypeScript \u548C RxJS \u5C06\u66F4\u51C6\u786E\u5730\u6D41\u7ECF\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u7684\u7C7B\u578B\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u66B4\u9732\u51FA\u5E94\u7528\u7A0B\u5E8F\u7C7B\u578B\u7684\u73B0\u6709\u9519\u8BEF"},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:true,step:"\u66F4\u65B0\u5230 Angular v6",action:'\u5C06\u4F60\u7684\u6240\u6709 Angular \u6846\u67B6\u5305\u66F4\u65B0\u5230 v6\uFF0C\u5E76\u6B63\u786E\u5B89\u88C5 RxJS \u548C TypeScript \u7684\u7248\u672C\u3002<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/><br/>\u66F4\u65B0\u540E\uFF0CTypeScript \u548C RxJS \u5C06\u66F4\u51C6\u786E\u5730\u6D41\u7ECF\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u7684\u7C7B\u578B\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u66B4\u9732\u51FA\u5E94\u7528\u7A0B\u5E8F\u7C7B\u578B\u7684\u73B0\u6709\u9519\u8BEF'},{possibleIn:600,necessaryAsOf:600,level:e.Advanced,step:"forms v6",action:"\u5728 Angular Forms \u4E2D\uFF0C\u5F53\u8C03\u7528 `AbstractControl#markAsPending` \u65F6\uFF0C`AbstractControl#statusChanges` \u73B0\u5728\u4F1A\u53D1\u51FA `PENDING` \u4E8B\u4EF6\u3002\u786E\u4FDD\u5982\u679C\u4F60\u5728\u8C03\u7528 `markAsPending` \u65F6\u8FC7\u6EE4\u6216\u68C0\u67E5 `statusChanges` \u4E8B\u4EF6\uFF0C\u4F60\u8981\u8003\u8651\u5230\u8C03\u7528 `markAsPending` \u65F6\u7684\u65B0\u4E8B\u4EF6\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Advanced,step:"\u52A8\u753B\u65F6\u5E8F",action:"\u5982\u679C\u5728\u7981\u7528\u7684 Zone \u4E2D\u4F7F\u7528 `AnimationEvent` \u7684 `totalTime`\uFF0C\u5B83\u5C06\u4E0D\u518D\u62A5\u544A\u4E3A 0\u3002\u8981\u68C0\u6D4B\u52A8\u753B\u4E8B\u4EF6\u662F\u5426\u62A5\u544A\u4E3A\u7981\u7528\u7684\u52A8\u753B\uFF0C\u5219\u53EF\u4EE5\u4F7F\u7528 `event.disabled` \u5C5E\u6027\u3002"},{possibleIn:600,necessaryAsOf:700,level:e.Advanced,step:"\u8868\u5355\u63A7\u4EF6\u4E0A\u7684 ngModel",action:"\u5728 v6 \u4E2D\u5DF2\u5F03\u7528\u5E76\u5728 v7 \u4E2D\u5220\u9664\u4E86\u5BF9\u4F7F\u7528 ngModel \u8F93\u5165\u5C5E\u6027\u548C ngModelChange \u4E8B\u4EF6\u4E0E\u54CD\u5E94\u5F0F\u8868\u5355\u6307\u4EE4\u4E00\u8D77\u4F7F\u7528\u7684\u652F\u6301\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Medium,step:"ngModelChange \u987A\u5E8F",action:"\u73B0\u5728\uFF0C\u5728\u66F4\u65B0\u63A7\u4EF6\u7684\u503C/\u6709\u6548\u6027\u540E\uFF0C`ngModelChange` \u88AB\u53D1\u51FA\uFF0C\u800C\u4E0D\u662F\u4E4B\u524D\uFF0C\u4EE5\u66F4\u597D\u5730\u5339\u914D\u9884\u671F\u3002\u5982\u679C\u4F60\u4F9D\u8D56\u4E8E\u8FD9\u4E9B\u4E8B\u4EF6\u7684\u987A\u5E8F\uFF0C\u4F60\u9700\u8981\u5F00\u59CB\u5728\u4F60\u7684\u7EC4\u4EF6\u4E2D\u8DDF\u8E2A\u65E7\u503C\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:false,material:true,step:"\u66F4\u65B0\u5230 v6 \u7684\u4F9D\u8D56\u9879",action:"\u5C06 Angular Material \u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C\u3002<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/material@6`<br/><br/>\u8FD9\u4E5F\u5C06\u81EA\u52A8\u8FC1\u79FB\u5DF2\u5F03\u7528\u7684 API\u3002"},{possibleIn:600,necessaryAsOf:600,level:e.Basic,windows:true,material:true,step:"\u66F4\u65B0\u5230 v6 \u7684\u4F9D\u8D56\u9879",action:'\u5C06 Angular Material \u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C\u3002<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/material@6"`<br/><br/>\u8FD9\u4E5F\u5C06\u81EA\u52A8\u8FC1\u79FB\u5DF2\u5F03\u7528\u7684 API\u3002'},{possibleIn:600,necessaryAsOf:600,level:e.Medium,step:"strictPropertyInitializer",action:'\u5982\u679C TypeScript \u914D\u7F6E\u4E3A\u4E25\u683C\u6A21\u5F0F\uFF08\u5982\u679C\u4F60\u5728 `tsconfig.json` \u6587\u4EF6\u4E2D\u5C06 `strict` \u8BBE\u7F6E\u4E3A `true`\uFF09\uFF0C\u8BF7\u66F4\u65B0\u4F60\u7684 `tsconfig.json` \u4EE5\u7981\u7528 `strictPropertyInitialization` \u6216\u5C06\u5C5E\u6027\u521D\u59CB\u5316\u4ECE `ngOnInit` \u79FB\u52A8\u5230\u4F60\u7684\u6784\u9020\u51FD\u6570\u3002\u4F60\u53EF\u4EE5\u5728<a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#strict-class-initialization">TypeScript 2.7 \u53D1\u5E03\u8BF4\u660E</a>\u4E2D\u4E86\u89E3\u66F4\u591A\u5173\u4E8E\u6B64\u6807\u5FD7\u7684\u4FE1\u606F\u3002'},{possibleIn:600,necessaryAsOf:700,level:e.Basic,step:"\u66F4\u65B0\u5230 RxJS 6",action:'\u4F7F\u7528<a href="https://github.com/ReactiveX/rxjs-tslint" target="_blank">rxjs-tslint \u81EA\u52A8\u66F4\u65B0\u89C4\u5219</a>\u5220\u9664\u5DF2\u5F03\u7528\u7684 RxJS 5 \u7279\u6027<br/><br/>\u5BF9\u4E8E\u5927\u591A\u6570\u5E94\u7528\u7A0B\u5E8F\uFF0C\u8FD9\u610F\u5473\u7740\u8FD0\u884C\u4EE5\u4E0B\u4E24\u4E2A\u547D\u4EE4\uFF1A<br/><br/>`npx rxjs-tslint`<br/>`rxjs-5-to-6-migrate -p src/tsconfig.app.json`'},{possibleIn:600,necessaryAsOf:800,level:e.Medium,step:"\u79FB\u9664 rxjs-compat",action:"\u4E00\u65E6\u4F60\u548C\u4F60\u6240\u6709\u7684\u4F9D\u8D56\u9879\u90FD\u5DF2\u66F4\u65B0\u5230 RxJS 6\uFF0C\u8BF7\u79FB\u9664 `rxjs-compat`\u3002"},{possibleIn:610,necessaryAsOf:800,level:e.Medium,step:"\u4F7F\u7528\u6587\u4EF6\u800C\u4E0D\u662F versionedFiles",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular Service Worker\uFF0C\u8BF7\u5C06\u4EFB\u4F55 `versionedFiles` \u8FC1\u79FB\u5230 `files` \u6570\u7EC4\u4E2D\u3002\u884C\u4E3A\u662F\u4E00\u6837\u7684\u3002"},{possibleIn:700,necessaryAsOf:700,level:e.Basic,step:"TypeScript 3.1",action:'Angular \u73B0\u5728\u4F7F\u7528 TypeScript 3.1\uFF0C\u8BF7\u9605\u8BFB\u6709\u5173\u4EFB\u4F55\u6F5C\u5728\u7684\u7834\u574F\u6027\u53D8\u5316\uFF1A<a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html">TypeScript 3.1 \u53D1\u5E03\u8BF4\u660E</a>'},{possibleIn:700,necessaryAsOf:700,level:e.Basic,step:"Node 10",action:'Angular \u73B0\u5728\u6DFB\u52A0\u4E86\u5BF9 Node 10 \u7684\u652F\u6301\uFF1A<a href="https://nodejs.org/en/blog/release/v10.0.0/" target="_blank">Node 10 \u53D1\u5E03\u8BF4\u660E</a>'},{possibleIn:700,necessaryAsOf:700,level:e.Basic,windows:false,step:"\u66F4\u65B0\u5230 v7",action:"\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/cli@7 @angular/core@7`\u6765\u66F4\u65B0\u6838\u5FC3\u6846\u67B6\u548C CLI \u5230 v7\u3002"},{possibleIn:700,necessaryAsOf:700,level:e.Basic,windows:true,step:"\u66F4\u65B0\u5230 v7",action:'\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/cli@7 @angular/core@7"`\u6765\u66F4\u65B0\u6838\u5FC3\u6846\u67B6\u548C CLI \u5230 v7\u3002'},{possibleIn:700,necessaryAsOf:700,level:e.Basic,windows:false,material:true,step:"\u66F4\u65B0\u5230 v7 \u7684 Material",action:"\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/material@7`\u6765\u66F4\u65B0 Angular Material \u5230 v7\u3002\u4F60\u5E94\u8BE5\u6D4B\u8BD5\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u662F\u5426\u6709\u5927\u5C0F\u548C\u5E03\u5C40\u7684\u53D8\u5316\u3002"},{possibleIn:700,necessaryAsOf:700,level:e.Basic,windows:true,material:true,step:"\u66F4\u65B0\u5230 v7 \u7684 Material",action:'\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/material@7"`\u6765\u66F4\u65B0 Angular Material \u5230 v7\u3002\u4F60\u5E94\u8BE5\u6D4B\u8BD5\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u662F\u5426\u6709\u5927\u5C0F\u548C\u5E03\u5C40\u7684\u53D8\u5316\u3002'},{possibleIn:700,necessaryAsOf:700,level:e.Medium,material:true,step:"v7 \u7684 Material \u53D8\u5316",action:"\u5982\u679C\u4F60\u4F7F\u7528\u5C4F\u5E55\u622A\u56FE\u6D4B\u8BD5\uFF0C\u4F60\u9700\u8981\u91CD\u65B0\u751F\u6210\u4F60\u7684\u5C4F\u5E55\u622A\u56FE\u9EC4\u91D1\u6587\u4EF6\uFF0C\u56E0\u4E3A\u8BB8\u591A\u6B21\u8981\u7684\u89C6\u89C9\u8C03\u6574\u5DF2\u7ECF\u5B8C\u6210\u3002"},{possibleIn:700,necessaryAsOf:800,level:e.Advanced,material:true,step:"v7 \u7684 Material \u5F03\u7528",action:"\u505C\u6B62\u4F7F\u7528 `matRippleSpeedFactor` \u548C `baseSpeedFactor` \u6765\u8FDB\u884C\u6D9F\u6F2A\uFF0C\u6539\u7528\u52A8\u753B\u914D\u7F6E\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,windows:false,step:"\u66F4\u65B0\u5230 v8",action:"\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/cli@8 @angular/core@8`\uFF0C\u7136\u540E\u67E5\u770B\u5E76\u63D0\u4EA4\u66F4\u6539\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,windows:true,step:"\u66F4\u65B0\u5230 v8",action:'\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8"`\uFF0C\u7136\u540E\u67E5\u770B\u5E76\u63D0\u4EA4\u66F4\u6539\u3002'},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"\u4F7F\u7528 ::ng-deep \u66FF\u4EE3 /deep/",action:"\u5728\u4F60\u7684\u6837\u5F0F\u4E2D\u7528 `::ng-deep` \u66FF\u6362 `/deep/`\uFF0C[\u4E86\u89E3\u66F4\u591A\u5173\u4E8E Angular \u7EC4\u4EF6\u6837\u5F0F\u548C ::ng-deep](https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep)\u3002 `/deep/` \u548C `::ng-deep` \u90FD\u5DF2\u5F03\u7528\uFF0C\u4F46\u5728\u5B8C\u5168\u4ECE\u6D4F\u89C8\u5668\u548C\u5DE5\u5177\u4E2D\u79FB\u9664\u5F71\u5B50\u7A7F\u900F\u540E\uFF0C\u4F7F\u7528 `::ng-deep` \u66F4\u53EF\u53D6\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"TypeScript 3.4",action:"Angular \u73B0\u5728\u4F7F\u7528 TypeScript 3.4\uFF0C[\u4E86\u89E3\u66F4\u591A\u53EF\u80FD\u7531\u6539\u8FDB\u7684\u7C7B\u578B\u68C0\u67E5\u5F15\u8D77\u7684\u9519\u8BEF](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html)\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"node 10",action:'\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10 \u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"\u5DEE\u5F02\u5316\u52A0\u8F7D",action:"CLI \u7684\u6784\u5EFA\u547D\u4EE4\u73B0\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\u4E00\u4E2A\u73B0\u4EE3\u7684 ES2015 \u6784\u5EFA\uFF0C\u5E26\u6709\u6700\u5C0F\u7684 polyfills\uFF0C\u5E76\u4E3A\u65E7\u7248\u6D4F\u89C8\u5668\u521B\u5EFA\u517C\u5BB9\u7684 ES5 \u6784\u5EFA\uFF0C\u5E76\u6839\u636E\u6D4F\u89C8\u5668\u52A0\u8F7D\u9002\u5F53\u7684\u6587\u4EF6\u3002 \u4F60\u53EF\u4EE5\u901A\u8FC7\u5C06 `tsconfig.json` \u4E2D\u7684 `target` \u8BBE\u7F6E\u56DE `es5` \u6765\u9009\u62E9\u9000\u51FA\u6B64\u66F4\u6539\u3002\u5728 [angular.io](https://angular.io/guide/deployment#differential-loading) \u4E0A\u4E86\u89E3\u66F4\u591A\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"CLI \u9065\u6D4B",action:"\u4F7F\u7528 CLI \u7684\u65B0\u7248\u672C\u65F6\uFF0C\u4F60\u5C06\u88AB\u8BE2\u95EE\u662F\u5426\u8981\u9009\u62E9\u52A0\u5165\u5171\u4EAB CLI \u4F7F\u7528\u6570\u636E\u3002\u4F60\u4E5F\u53EF\u4EE5\u6DFB\u52A0\u81EA\u5DF1\u7684 Google Analytics \u5E10\u6237\u3002\u8FD9\u6837\u6211\u4EEC\u53EF\u4EE5\u66F4\u597D\u5730\u51B3\u5B9A\u4F18\u5148\u8003\u8651\u54EA\u4E9B CLI \u529F\u80FD\uFF0C\u5E76\u8861\u91CF\u6211\u4EEC\u6539\u8FDB\u7684\u5F71\u54CD\u3002\u5728 [angular.io](https://angular.io/analytics) \u4E0A\u4E86\u89E3\u66F4\u591A\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,step:"\u9759\u6001\u67E5\u8BE2\u65F6\u673A",action:"\u5982\u679C\u4F60\u4F7F\u7528 `ViewChild` \u6216 `ContentChild`\uFF0C\u6211\u4EEC\u6B63\u5728\u66F4\u65B0\u89E3\u6790\u8FD9\u4E9B\u67E5\u8BE2\u7684\u65B9\u5F0F\uFF0C\u4EE5\u7ED9\u5F00\u53D1\u8005\u66F4\u591A\u63A7\u5236\u3002\u4F60\u73B0\u5728\u5FC5\u987B\u6307\u5B9A\u53D8\u66F4\u68C0\u6D4B\u5E94\u8BE5\u5728\u8BBE\u7F6E\u7ED3\u679C\u4E4B\u524D\u8FD0\u884C\u3002\u793A\u4F8B\uFF1A`@ContentChild('foo', {static: false}) foo !: ElementRef;`\u3002 `ng update` \u5C06\u81EA\u52A8\u66F4\u65B0\u4F60\u7684\u67E5\u8BE2\uFF0C\u4F46\u5B83\u4F1A\u503E\u5411\u4E8E\u4F7F\u4F60\u7684\u67E5\u8BE2\u4E3A `static`\uFF0C\u4EE5\u4FDD\u8BC1\u517C\u5BB9\u6027\u3002\u5728 [angular.io](https://angular.io/guide/static-query-migration) \u4E0A\u4E86\u89E3\u66F4\u591A\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,windows:false,material:true,step:"\u66F4\u65B0\u5230 v8 \u7684 Material",action:"\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/material@8`\u3002"},{possibleIn:800,necessaryAsOf:800,level:e.Basic,windows:true,material:true,step:"\u66F4\u65B0\u5230 v8 \u7684 Material",action:'\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/material@8"`\u3002'},{possibleIn:800,necessaryAsOf:900,level:e.Basic,material:true,step:"\u6DF1\u5EA6\u5BFC\u5165",action:"\u4E0D\u8981\u76F4\u63A5\u4ECE `@angular/material` \u5BFC\u5165\uFF0C\u800C\u662F\u4ECE\u7279\u5B9A\u7EC4\u4EF6\u8FDB\u884C\u6DF1\u5EA6\u5BFC\u5165\u3002\u4F8B\u5982 `@angular/material/button`\u3002`ng update` \u5C06\u4E3A\u4F60\u81EA\u52A8\u5B8C\u6210\u6B64\u64CD\u4F5C\u3002"},{possibleIn:800,necessaryAsOf:900,level:e.Basic,step:"\u65B0\u7684 loadChildren",action:"\u5BF9\u4E8E\u901A\u8FC7\u8DEF\u7531\u5668\u8FDB\u884C\u7684\u60F0\u6027\u52A0\u8F7D\u7684\u6A21\u5757\uFF0C\u8BF7\u786E\u4FDD\u4F60\u6B63\u5728[\u4F7F\u7528\u52A8\u6001\u5BFC\u5165](https://angular.io/guide/deprecations#loadchildren-string-syntax)\u3002\u5728 v9 \u4E2D\uFF0C\u901A\u8FC7\u5B57\u7B26\u4E32\u8FDB\u884C\u5BFC\u5165\u5DF2\u88AB\u79FB\u9664\u3002`ng update` \u5E94\u8BE5\u4F1A\u81EA\u52A8\u5904\u7406\u8FD9\u4E2A\u3002\u5728 [angular.io](https://angular.io/guide/deprecations#loadchildren-string-syntax) \u4E0A\u4E86\u89E3\u66F4\u591A\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"\u5E73\u53F0\u5E9F\u5F03",action:"\u6211\u4EEC\u6B63\u5728\u5E9F\u5F03\u5BF9 `@angular/platform-webworker` \u7684\u652F\u6301\uFF0C\u56E0\u4E3A\u5B83\u4E0E CLI \u4E0D\u517C\u5BB9\u3002\u5728 Web Worker \u4E2D\u8FD0\u884C Angular \u7684\u6E32\u67D3\u67B6\u6784\u4E0D\u7B26\u5408\u5F00\u53D1\u8005\u7684\u9700\u6C42\u3002\u4F60\u4ECD\u7136\u53EF\u4EE5\u5728 Angular \u4E2D\u4F7F\u7528 Web Worker\u3002\u5728\u6211\u4EEC\u7684 [Web Worker \u6307\u5357](https://v9.angular.io/guide/web-worker) \u4E2D\u4E86\u89E3\u66F4\u591A\u3002\u5982\u679C\u4F60\u6709\u9700\u8981\u8FD9\u65B9\u9762\u7684\u7528\u4F8B\uFF0C\u8BF7\u901A\u8FC7 [email protected] \u4E0E\u6211\u4EEC\u8054\u7CFB\uFF01"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"node-sass",action:"\u6211\u4EEC\u5DF2\u7ECF\u4ECE\u672C\u5730 Sass \u7F16\u8BD1\u5668\u5207\u6362\u5230 JavaScript \u7F16\u8BD1\u5668\u3002\u8981\u5207\u6362\u56DE\u672C\u5730\u7248\u672C\uFF0C\u8BF7\u5C06\u5176\u5B89\u88C5\u4E3A devDependency\uFF1A`npm install node-sass --save-dev`\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"schematics \u5F02\u6B65",action:"\u5982\u679C\u4F60\u6B63\u5728\u6784\u5EFA\u81EA\u5DF1\u7684 Schematics\uFF0C\u5B83\u4EEC\u4E4B\u524D*\u53EF\u80FD*\u662F\u5F02\u6B65\u7684\u3002\u4ECE 8.0 \u5F00\u59CB\uFF0C\u6240\u6709\u7684 Schematics \u90FD\u5C06\u662F\u5F02\u6B65\u7684\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,step:"node 10.13",action:'\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10.13 \u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:false,step:"\u66F4\u65B0\u5230 CLI v8 \u6700\u65B0\u7248\u672C",action:"\u5728\u4F60\u7684\u5DE5\u4F5C\u7A7A\u95F4\u76EE\u5F55\u4E2D\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/core@8 @angular/cli@8`\uFF0C\u4EE5\u66F4\u65B0\u5230\u6700\u65B0\u7684 8.x \u7248\u672C\u7684 `@angular/core` \u548C `@angular/cli` \u5E76\u63D0\u4EA4\u8FD9\u4E9B\u66F4\u6539\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:true,step:"\u66F4\u65B0\u5230 CLI v8 \u6700\u65B0\u7248\u672C",action:'\u5728\u4F60\u7684\u5DE5\u4F5C\u7A7A\u95F4\u76EE\u5F55\u4E2D\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8`\uFF0C\u4EE5\u66F4\u65B0\u5230\u6700\u65B0\u7684 8.x \u7248\u672C\u7684 `@angular/core` \u548C `@angular/cli` \u5E76\u63D0\u4EA4\u8FD9\u4E9B\u66F4\u6539\u3002'},{possibleIn:900,necessaryAsOf:900,level:e.Medium,step:"\u521B\u5EFA\u63D0\u4EA4",action:"\u4F60\u53EF\u4EE5\u9009\u62E9\u5411 [ng update](https://angular.io/cli/update) \u547D\u4EE4\u4F20\u9012 `--create-commits`\uFF08\u6216 `-C`\uFF09\u6807\u5FD7\uFF0C\u4EE5\u6BCF\u4E2A\u72EC\u7ACB\u8FC1\u79FB\u521B\u5EFA\u4E00\u4E2A git \u63D0\u4EA4\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:false,step:"ng update v9",action:"\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/core@9 @angular/cli@9`\uFF0C\u5E94\u8BE5\u5C06\u4F60\u5347\u7EA7\u5230 Angular \u7684 9 \u7248\u672C\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:true,step:"ng update v9",action:'\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/cli@9 @angular/core@9"`\uFF0C\u5E94\u8BE5\u5C06\u4F60\u5347\u7EA7\u5230 Angular \u7684 9 \u7248\u672C\u3002'},{possibleIn:900,necessaryAsOf:900,level:e.Basic,step:"typescript 3.8",action:"\u4F60\u7684\u9879\u76EE\u73B0\u5728\u5DF2\u66F4\u65B0\u5230 TypeScript 3.8\uFF0C\u8BF7\u9605\u8BFB\u6709\u5173\u65B0\u7F16\u8BD1\u5668\u68C0\u67E5\u548C\u53EF\u80FD\u9700\u8981\u4FEE\u590D\u4EE3\u7801\u4E2D\u95EE\u9898\u7684\u9519\u8BEF\u7684\u66F4\u591A\u4FE1\u606F\uFF0C\u53EF\u5728 [TypeScript 3.7](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html) \u6216 [TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html) \u516C\u544A\u4E2D\u4E86\u89E3\u66F4\u591A\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:false,material:true,step:"\u66F4\u65B0 @angular/material",action:"\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/material@9`\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,windows:true,material:true,step:"\u66F4\u65B0 @angular/material",action:'\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/material@9"`\u3002'},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,windows:false,step:"\u66F4\u65B0 @nguniversal/hapi-engine",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular Universal\uFF0C\u8BF7\u8FD0\u884C `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/hapi-engine@9` \u6216 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/express-engine@9`\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u4F60\u4F7F\u7528\u7684\u5F15\u64CE\u3002\u5982\u679C\u4F60\u7684\u4EFB\u4F55\u7B2C\u4E09\u65B9\u4F9D\u8D56\u9879\u672A\u66F4\u65B0\u5176\u5BF9\u7B49\u4F9D\u8D56\u9879\u7684 Angular \u7248\u672C\uFF0C\u5219\u6B64\u6B65\u9AA4\u53EF\u80FD\u9700\u8981 `--force` \u6807\u5FD7\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,windows:true,step:"\u66F4\u65B0 @nguniversal/hapi-engine",action:'\u5982\u679C\u4F60\u4F7F\u7528 Angular Universal\uFF0C\u8BF7\u8FD0\u884C `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/hapi-engine@9"` \u6216 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/express-engine@9"`\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u4F60\u4F7F\u7528\u7684\u5F15\u64CE\u3002\u5982\u679C\u4F60\u7684\u4EFB\u4F55\u7B2C\u4E09\u65B9\u4F9D\u8D56\u9879\u672A\u66F4\u65B0\u5176\u5BF9\u7B49\u4F9D\u8D56\u9879\u7684 Angular \u7248\u672C\uFF0C\u5219\u6B64\u6B65\u9AA4\u53EF\u80FD\u9700\u8981 `--force` \u6807\u5FD7\u3002'},{possibleIn:900,necessaryAsOf:900,level:e.Basic,step:"\u66F4\u65B0\u4F9D\u8D56\u9879",action:"\u5982\u679C\u4F60\u7684\u9879\u76EE\u4F9D\u8D56\u4E8E\u5176\u4ED6 Angular \u5E93\uFF0C\u6211\u4EEC\u5EFA\u8BAE\u4F60\u8003\u8651\u66F4\u65B0\u5230\u5B83\u4EEC\u7684\u6700\u65B0\u7248\u672C\u3002\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B\uFF0C\u6B64\u66F4\u65B0\u53EF\u80FD\u662F\u5FC5\u9700\u7684\uFF0C\u4EE5\u89E3\u51B3 API \u4E0D\u517C\u5BB9\u6027\u3002\u67E5\u9605 `ng update` \u6216 `npm outdated` \u4EE5\u4E86\u89E3\u4F60\u8FC7\u65F6\u7684\u5E93\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Basic,step:"\u66F4\u65B0 Ivy",action:"\u5728\u5347\u7EA7\u5230 9 \u7248\u672C\u671F\u95F4\uFF0C\u901A\u8FC7\u4EE3\u7801\u8FC1\u79FB\u5FC5\u8981\u5730\u8F6C\u6362\u4E86\u4F60\u7684\u9879\u76EE\uFF0C\u4EE5\u4ECE\u4EE3\u7801\u5E93\u4E2D\u79FB\u9664\u4EFB\u4F55\u4E0D\u517C\u5BB9\u6216\u5DF2\u5E9F\u5F03\u7684 API \u8C03\u7528\u3002\u73B0\u5728\u4F60\u53EF\u4EE5\u67E5\u770B\u8FD9\u4E9B\u66F4\u6539\uFF0C\u5E76\u67E5\u9605 [\u5347\u7EA7\u5230 9 \u7248\u672C\u6307\u5357](https://v9.angular.io/guide/updating-to-version-9) \u4EE5\u4E86\u89E3\u66F4\u591A\u8BE6\u60C5\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Medium,step:"\u66F4\u65B0\u6837\u5F0F",action:"\u4EE5\u524D\uFF0C\u7ED1\u5B9A\u7684 CSS \u6837\u5F0F\u548C\u7C7B\u662F\u91C7\u7528\u201C\u6700\u540E\u4E00\u6B21\u66F4\u6539\u83B7\u80DC\u201D\u7684\u7B56\u7565\u5E94\u7528\u7684\uFF0C\u4F46\u73B0\u5728\u9075\u5FAA\u4E00\u4E2A\u5B9A\u4E49\u597D\u7684\u4F18\u5148\u7EA7\u3002\u4E86\u89E3\u66F4\u591A\u5173\u4E8E [\u6837\u5F0F\u4F18\u5148\u7EA7](https://angular.io/guide/attribute-binding#styling-precedence)\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"ModuleWithProviders",action:"\u5982\u679C\u4F60\u662F\u5E93\u7684\u4F5C\u8005\uFF0C\u5E76\u4E14\u6709\u4E00\u4E2A\u8FD4\u56DE `ModuleWithProviders` \u7684\u65B9\u6CD5\uFF08\u901A\u5E38\u662F\u901A\u8FC7\u540D\u4E3A `forRoot()` \u7684\u65B9\u6CD5\uFF09\uFF0C\u5219\u9700\u8981\u6307\u5B9A\u6CDB\u578B\u7C7B\u578B\u3002\u4E86\u89E3\u66F4\u591A [angular.io](https://v9.angular.io/guide/deprecations#modulewithproviders-type-without-a-generic)"},{possibleIn:800,necessaryAsOf:900,level:e.Advanced,step:"wtf",action:"\u5728 Angular 8 \u4E2D\uFF0C\u652F\u6301 Web \u8FFD\u8E2A\u6846\u67B6\u5DF2\u5E9F\u5F03\u3002\u4F60\u5E94\u8BE5\u505C\u6B62\u4F7F\u7528\u4EFB\u4F55 `wtf*` API\u3002\u4E3A\u4E86\u8FDB\u884C\u6027\u80FD\u8FFD\u8E2A\uFF0C\u6211\u4EEC\u5EFA\u8BAE\u4F7F\u7528 [\u6D4F\u89C8\u5668\u6027\u80FD\u5DE5\u5177](https://developers.google.com/web/tools/lighthouse/audits/user-timing)\u3002"},{possibleIn:800,necessaryAsOf:900,level:e.Medium,step:"es5 \u6D4F\u89C8\u5668",action:"\u5728\u4F60\u7684 `angular.json` \u4E2D\u5220\u9664\u4EFB\u4F55 `es5BrowserSupport` \u6807\u5FD7\uFF0C\u5E76\u5C06\u4F60\u7684 `tsconfig.json` \u4E2D\u7684 `target` \u8BBE\u7F6E\u4E3A `es2015`\u3002Angular \u73B0\u5728\u4F7F\u7528\u4F60\u7684 browserslist \u6765\u786E\u5B9A\u662F\u5426\u9700\u8981 ES5 \u6784\u5EFA\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Medium,step:"ngForm \u9009\u62E9\u5668",action:"\u5982\u679C\u4F60\u4F7F\u7528 `ngForm` \u5143\u7D20\u9009\u62E9\u5668\u521B\u5EFA Angular \u8868\u5355\uFF0C\u4F60\u5E94\u8BE5\u6539\u7528 `ng-form`\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"typings \u7F16\u8BD1",action:"\u6211\u4EEC\u5DF2\u66F4\u65B0 `tsconfig.app.json` \u4EE5\u9650\u5236\u7F16\u8BD1\u7684\u6587\u4EF6\u3002\u5982\u679C\u4F60\u4F9D\u8D56\u4E8E\u5176\u4ED6\u6587\u4EF6\u88AB\u5305\u542B\u5728\u7F16\u8BD1\u4E2D\uFF0C\u6BD4\u5982\u4E00\u4E2A `typings.d.ts` \u6587\u4EF6\uFF0C\u4F60\u9700\u8981\u624B\u52A8\u5C06\u5176\u6DFB\u52A0\u5230\u7F16\u8BD1\u4E2D\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"\u8C03\u8BD5",action:"\u968F\u7740 Angular 9\uFF0CIvy \u73B0\u5728\u662F\u9ED8\u8BA4\u7684\u6E32\u67D3\u5F15\u64CE\uFF0C\u9488\u5BF9\u53EF\u80FD\u51FA\u73B0\u7684\u4EFB\u4F55\u517C\u5BB9\u6027\u95EE\u9898\uFF0C\u9605\u8BFB [Ivy \u517C\u5BB9\u6027\u6307\u5357](https://v9.angular.io/guide/ivy-compatibility)\u3002"},{possibleIn:900,necessaryAsOf:900,level:e.Advanced,step:"express-universal-server",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular Universal \u4E0E `@nguniversal/express-engine` \u6216 `@nguniversal/hapi-engine`\uFF0C\u5C06\u4F1A\u521B\u5EFA\u51E0\u4E2A\u5907\u4EFD\u6587\u4EF6\u3002\u5176\u4E2D\u4E00\u4E2A\u662F\u7528\u4E8E `server.ts` \u7684\u3002\u5982\u679C\u6B64\u6587\u4EF6\u4E0E\u9ED8\u8BA4\u6587\u4EF6\u4E0D\u540C\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u624B\u52A8\u5C06\u4E00\u4E9B\u66F4\u6539\u4ECE `server.ts.bak` \u590D\u5236\u5230 `server.ts`\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Basic,step:"ivy i18n",action:"Angular 9 \u5F15\u5165\u4E86\u4E00\u4E2A\u5168\u5C40\u7684 `$localize()` \u51FD\u6570\uFF0C\u5982\u679C\u4F60\u4F9D\u8D56\u4E8E Angular \u7684\u56FD\u9645\u5316\uFF08i18n\uFF09\uFF0C\u5219\u9700\u8981\u52A0\u8F7D\u5B83\u3002\u8FD0\u884C `ng add @angular/localize` \u6765\u6DFB\u52A0\u5FC5\u8981\u7684\u5305\u548C\u4EE3\u7801\u4FEE\u6539\u3002\u67E5\u9605 [$localize \u5168\u5C40\u5BFC\u5165\u8FC1\u79FB\u6307\u5357](https://v9.angular.io/guide/migration-localize) \u4EE5\u4E86\u89E3\u66F4\u591A\u53D8\u5316\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"entryComponents",action:"\u5728\u4F60\u7684\u5E94\u7528\u9879\u76EE\u4E2D\uFF0C\u4F60\u53EF\u4EE5\u5220\u9664 `entryComponents` NgModules \u548C\u4EFB\u4F55\u4F7F\u7528 `ANALYZE_FOR_ENTRY_COMPONENTS` \u7684\u5730\u65B9\u3002\u5B83\u4EEC\u5728 Ivy \u7F16\u8BD1\u5668\u548C\u8FD0\u884C\u65F6\u4E2D\u4E0D\u518D\u9700\u8981\u3002\u5982\u679C\u6784\u5EFA\u7684\u662F\u4E00\u4E2A\u5C06\u88AB View Engine \u5E94\u7528\u7A0B\u5E8F\u6D88\u8D39\u7684\u5E93\uFF0C\u53EF\u80FD\u9700\u8981\u4FDD\u7559\u8FD9\u4E9B\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"testbed-get",action:"\u5982\u679C\u4F60\u4F7F\u7528 `TestBed.get`\uFF0C\u4F60\u5E94\u8BE5\u6539\u7528 `TestBed.inject`\u3002\u8FD9\u4E2A\u65B0\u65B9\u6CD5\u5177\u6709\u76F8\u540C\u7684\u884C\u4E3A\uFF0C\u4F46\u662F\u7C7B\u578B\u5B89\u5168\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"$localize",action:"\u5982\u679C\u4F60\u4F7F\u7528 [Angular \u7684\u56FD\u9645\u5316\u652F\u6301](http://angular.io/guide/i18n)\uFF0C\u4F60\u5C06\u9700\u8981\u5F00\u59CB\u4F7F\u7528 `@angular/localize`\u3002\u4E86\u89E3\u66F4\u591A\u5173\u4E8E [$localize \u5168\u5C40\u5BFC\u5165\u8FC1\u79FB](https://v9.angular.io/guide/migration-localize)\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Basic,step:"v10 NodeJS 12",action:'\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528 <a href="https://nodejs.org/dist/latest-v12.x/" target="_blank">Node 12 \u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Basic,step:"ng update v10",action:"\u8FD0\u884C `npx @angular/cli@10 update @angular/core@10 @angular/cli@10`\uFF0C\u8FD9\u5C06\u4F7F\u4F60\u7684 Angular \u7248\u672C\u5347\u7EA7\u5230 10\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Basic,material:true,step:"\u66F4\u65B0 @angular/material",action:"\u8FD0\u884C `npx @angular/cli@10 update @angular/material@10`\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Basic,step:"browserlist",action:"\u65B0\u9879\u76EE\u4F7F\u7528\u6587\u4EF6\u540D `.browserslistrc`\uFF0C\u800C\u4E0D\u662F `browserslist`\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"v10-versions",action:"Angular \u73B0\u5728\u9700\u8981 `tslint` v6\u3001`tslib` v2 \u548C [TypeScript 3.9](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html)\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"styleext",action:"\u505C\u6B62\u5728\u4F60\u7684 Angular schematics \u4E2D\u4F7F\u7528 `styleext` \u6216 `spec`\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"classes-without-decorators",action:"\u5728 10 \u7248\u672C\u4E2D\uFF0C\u4E0D\u5E26\u6709 Angular \u88C5\u9970\u5668\u7684\u7C7B\u4E0D\u518D\u53D7\u652F\u6301\u3002[\u4E86\u89E3\u66F4\u591A](https://v10.angular.io/guide/migration-undecorated-classes)\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:900,necessaryAsOf:1e3,level:e.Medium,step:"injectable-definitions",action:"\u4ECE Angular 9 \u5F00\u59CB\uFF0C\u5BF9\u4E8E DI\uFF0C@Injectable \u88C5\u9970\u5668\u7684\u6267\u884C\u66F4\u52A0\u4E25\u683C\uFF0C\u4E0D\u5B8C\u6574\u7684\u63D0\u4F9B\u7A0B\u5E8F\u5B9A\u4E49\u7684\u884C\u4E3A\u4F1A\u6709\u6240\u4E0D\u540C\u3002[\u4E86\u89E3\u66F4\u591A](https://v9.angular.io/guide/migration-injectable)\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"closure-jsdoc-comments",action:"Angular \u7684 NPM \u5305\u4E0D\u518D\u5305\u542B jsdoc \u6CE8\u91CA\uFF0C\u8FD9\u5728\u4E0E\u95ED\u5305\u7F16\u8BD1\u5668\u7684\u4F7F\u7528\u4E2D\u662F\u5FC5\u9700\u7684\uFF08\u6781\u5176\u7F55\u89C1\uFF09\u3002\u6B64\u652F\u6301\u662F\u5B9E\u9A8C\u6027\u7684\uFF0C\u5E76\u4E14\u53EA\u5728\u4E00\u4E9B\u60C5\u51B5\u4E0B\u8D77\u4F5C\u7528\u3002\u5F88\u5FEB\u5C06\u5BA3\u5E03\u66FF\u4EE3\u63A8\u8350\u8DEF\u5F84\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"forms-number-input",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular \u8868\u5355\uFF0C`number` \u7C7B\u578B\u7684\u8F93\u5165\u4E0D\u518D\u76D1\u542C [change \u4E8B\u4EF6](https://developer.mozilla.org/docs/Web/API/HTMLElement/change_event)\uFF08\u8FD9\u4E9B\u4E8B\u4EF6\u4E0D\u4E00\u5B9A\u4F1A\u5728\u6BCF\u6B21\u66F4\u6539\u503C\u65F6\u89E6\u53D1\uFF09\uFF0C\u800C\u662F\u76D1\u542C [input \u4E8B\u4EF6](https://developer.mozilla.org/docs/Web/API/HTMLElement/input_event)\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"forms-length-input",action:"\u5BF9\u4E8E Angular \u8868\u5355\u9A8C\u8BC1\uFF0C`minLength` \u548C `maxLength` \u9A8C\u8BC1\u5668\u73B0\u5728\u9A8C\u8BC1\u8868\u5355\u63A7\u4EF6\u7684\u503C\u662F\u5426\u5177\u6709\u6570\u5B57\u957F\u5EA6\u5C5E\u6027\uFF0C\u5E76\u4E14\u4EC5\u5728\u8FD9\u79CD\u60C5\u51B5\u4E0B\u9A8C\u8BC1\u957F\u5EA6\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"esm5-bundles",action:"Angular \u5305\u683C\u5F0F\u5DF2\u66F4\u65B0\uFF0C\u5220\u9664\u4E86 `esm5` \u548C `fesm5` \u683C\u5F0F\u3002\u8FD9\u4E9B\u4E0D\u518D\u5206\u53D1\u5728\u6211\u4EEC\u7684 npm \u5305\u4E2D\u3002\u5982\u679C\u4F60\u4E0D\u4F7F\u7528 CLI\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u81EA\u884C\u5C06 Angular \u4EE3\u7801\u964D\u7EA7\u5230 ES5\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"console-errors",action:"\u6709\u5173\u672A\u77E5\u5143\u7D20\u7684\u8B66\u544A\u73B0\u5728\u8BB0\u5F55\u4E3A\u9519\u8BEF\u3002\u8FD9\u4E0D\u4F1A\u7834\u574F\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\uFF0C\u4F46\u53EF\u80FD\u4F1A\u4F7F\u671F\u671B `console.error` \u4E0D\u8BB0\u5F55\u4EFB\u4F55\u5185\u5BB9\u7684\u5DE5\u5177\u53D7\u5230\u5F71\u54CD\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"router-resolver-empty",action:"\u4EFB\u4F55\u8FD4\u56DE `EMPTY` \u7684\u89E3\u6790\u5668\u5C06\u53D6\u6D88\u5BFC\u822A\u3002\u5982\u679C\u4F60\u60F3\u8981\u5141\u8BB8\u5BFC\u822A\u7EE7\u7EED\uFF0C\u4F60\u9700\u8981\u66F4\u65B0\u89E3\u6790\u5668\u4EE5\u53D1\u51FA\u4E00\u4E9B\u503C\uFF08\u4F8B\u5982 `defaultIfEmpty(...)`\u3001`of(...)` \u7B49\uFF09\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"sw-vary-headers",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular \u670D\u52A1\u5DE5\u4F5C\u5668\u5E76\u4F9D\u8D56\u4E8E\u5E26\u6709 [Vary](https://developer.mozilla.org/docs/Web/HTTP/Headers/Vary) \u6807\u5934\u7684\u8D44\u6E90\uFF0C\u8FD9\u4E9B\u6807\u5934\u73B0\u5728\u88AB\u5FFD\u7565\uFF0C\u4EE5\u907F\u514D\u5728\u5404\u4E2A\u6D4F\u89C8\u5668\u4E4B\u95F4\u51FA\u73B0\u4E0D\u53EF\u9884\u6D4B\u7684\u884C\u4E3A\u3002\u4E3A\u4E86\u907F\u514D\u8FD9\u79CD\u60C5\u51B5\uFF0C[\u914D\u7F6E](https://angular.io/guide/service-worker-config) \u4F60\u7684\u670D\u52A1\u5DE5\u4F5C\u5668\u4EE5\u907F\u514D\u7F13\u5B58\u8FD9\u4E9B\u8D44\u6E90\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Medium,step:"expression-changed-after-checked-new",action:"\u5F53\u4F7F\u7528 `async` \u7BA1\u9053\u65F6\uFF0C\u4F60\u53EF\u80FD\u4F1A\u770B\u5230\u4E4B\u524D\u672A\u68C0\u6D4B\u5230\u7684 `ExpressionChangedAfterItHasBeenChecked` \u9519\u8BEF\u3002\u4EE5\u524D\u7684\u9519\u8BEF\u53EF\u80FD\u672A\u88AB\u68C0\u6D4B\u5230\uFF0C\u56E0\u4E3A\u4E24\u4E2A `WrappedValues` \u5728\u68C0\u67E5\u76EE\u7684\u4E0A\u88AB\u8BA4\u4E3A\u662F\u201C\u76F8\u7B49\u7684\u201D\uFF0C\u5373\u4F7F\u5B83\u4EEC\u5404\u81EA\u7684\u672A\u5305\u88C5\u503C\u4E0D\u76F8\u7B49\u3002\u5728\u7248\u672C 10 \u4E2D\uFF0C`WrappedValue` \u5DF2\u88AB\u79FB\u9664\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"property-binding-change-detection",action:"\u5982\u679C\u4F60\u6709\u4E00\u4E2A\u5C5E\u6027\u7ED1\u5B9A\uFF0C\u4F8B\u5982 `[val]=(observable | async).someProperty`\uFF0C\u5982\u679C `someProperty` \u7684\u503C\u4E0E\u4E4B\u524D\u7684\u53D1\u5C04\u503C\u76F8\u540C\uFF0C\u8FD9\u5C06\u4E0D\u518D\u89E6\u53D1\u53D8\u66F4\u68C0\u6D4B\u3002\u5982\u679C\u4F60\u4F9D\u8D56\u4E8E\u6B64\u884C\u4E3A\uFF0C\u8981\u4E48\u624B\u52A8\u8BA2\u9605\u5E76\u6839\u636E\u9700\u8981\u8C03\u7528 `markForCheck`\uFF0C\u8981\u4E48\u66F4\u65B0\u7ED1\u5B9A\u4EE5\u786E\u4FDD\u5F15\u7528\u66F4\u6539\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"day-periods-crossing-midnight",action:"\u5982\u679C\u4F60\u4F7F\u7528 `formatDate()` \u6216 `DatePipe`\uFF0C\u5E76\u4E14\u4F7F\u7528\u4E86\u4EFB\u4F55 `b` \u6216 `B` \u683C\u5F0F\u4EE3\u7801\uFF0C\u903B\u8F91\u5DF2\u66F4\u65B0\uFF0C\u4F7F\u5176\u5339\u914D\u8DE8\u8D8A\u5348\u591C\u7684\u4E00\u5929\u65F6\u6BB5\u5185\u7684\u65F6\u95F4\uFF0C\u56E0\u6B64\u73B0\u5728\u5C06\u6E32\u67D3\u6B63\u786E\u7684\u8F93\u51FA\uFF0C\u4F8B\u5982\u5728\u82F1\u6587\u73AF\u5883\u4E2D\u7684 `night`\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Advanced,step:"urlmatcher-null",action:"\u5982\u679C\u4F60\u4F7F\u7528 `UrlMatcher`\uFF0C\u73B0\u5728\u5176\u7C7B\u578B\u53CD\u6620\u4E86\u5B83\u53EF\u4EE5\u59CB\u7EC8\u8FD4\u56DE `null`\u3002"},{possibleIn:1e3,necessaryAsOf:1e3,level:e.Basic,step:"v10-more-details",action:"\u6709\u5173\u505C\u7528\u3001\u81EA\u52A8\u8FC1\u79FB\u548C\u66F4\u6539\u7684\u66F4\u591A\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u8BBF\u95EE [guide angular.io](https://v10.angular.io/guide/updating-to-version-10)"},{possibleIn:1020,necessaryAsOf:1020,level:e.Medium,step:"universal-baseurl",action:"\u5BF9\u4E8E Angular Universal \u7528\u6237\uFF0C\u5982\u679C\u4F60\u4F7F\u7528 `useAbsoluteUrl` \u6765\u8BBE\u7F6E `platform-server`\uFF0C\u73B0\u5728\u8FD8\u9700\u8981\u6307\u5B9A `baseUrl`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Basic,step:"v11 ng update",action:"\u8FD0\u884C `ng update @angular/core@11 @angular/cli@11` \u5C06\u628A\u4F60\u7684 Angular \u7248\u672C\u5347\u7EA7\u5230 11\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@11`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Basic,step:"v11 versions",action:"Angular \u73B0\u5728\u9700\u8981 [TypeScript 4.0](https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/)\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u7684\u9879\u76EE\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Basic,step:"v11 browser support",action:"\u4E0D\u518D\u652F\u6301 IE9\u3001IE10 \u548C IE \u79FB\u52A8\u7248\u3002\u8FD9\u5728 [v10 \u66F4\u65B0](http://blog.angular.dev/version-10-of-angular-now-available-78960babd41#c357) \u4E2D\u5DF2\u7ECF\u5BA3\u5E03\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"webpack5 optin",action:'\u4F60\u73B0\u5728\u53EF\u4EE5\u9009\u62E9\u4F7F\u7528 webpack 5\uFF0C\u4F7F\u7528 Yarn \u5E76\u5C06 `"resolutions": {"webpack": "^5.0.0"}` \u6DFB\u52A0\u5230\u4F60\u7684 `package.json`\u3002'},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"ng new strict prompt",action:"\u5F53\u751F\u6210\u65B0\u9879\u76EE\u65F6\uFF0C\u4F60\u5C06\u88AB\u8BE2\u95EE\u662F\u5426\u8981\u542F\u7528\u4E25\u683C\u6A21\u5F0F\u3002\u8FD9\u5C06\u4E3A TypeScript \u548C Angular \u7F16\u8BD1\u5668\u914D\u7F6E\u66F4\u4E25\u683C\u7684\u7C7B\u578B\u68C0\u67E5\uFF0C\u5E76\u9ED8\u8BA4\u5E94\u7528\u66F4\u5C0F\u7684\u6346\u7ED1\u9884\u7B97\u3002\u4F60\u53EF\u4EE5\u4F7F\u7528 `--strict=true` \u6216 `--strict=false` \u6765\u8DF3\u8FC7\u63D0\u793A\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 router relativeLinkResolution",action:"\u5982\u679C\u4F60\u4F7F\u7528\u8DEF\u7531\u5668\uFF0C`relativeLinkResolution` \u7684\u9ED8\u8BA4\u503C\u4ECE `legacy` \u6539\u4E3A `corrected`\u3002\u5982\u679C\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u4EE5\u524D\u4F7F\u7528\u9ED8\u8BA4\u503C\u800C\u672A\u5728 `ExtraOptions` \u4E2D\u6307\u5B9A\u503C\uFF0C\u5E76\u4E14\u5728\u4ECE\u7A7A\u8DEF\u5F84\u8DEF\u7531\u7684\u5B50\u8DEF\u7531\u5BFC\u822A\u65F6\u4F7F\u7528\u76F8\u5BF9\u94FE\u63A5\uFF0C\u4F60\u9700\u8981\u66F4\u65B0\u4F60\u7684 `RouterModule` \u914D\u7F6E\uFF0C\u660E\u786E\u4E3A `relativeLinkResolution` \u6307\u5B9A `legacy`\u3002\u53C2\u89C1 [\u6587\u6863](https://v11.angular.io/api/router/ExtraOptions#relativeLinkResolution) \u4EE5\u83B7\u53D6\u66F4\u591A\u8BE6\u7EC6\u4FE1\u606F\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 router initialNavigation",action:"\u5728 Angular \u8DEF\u7531\u5668\u4E2D\uFF0Cv4 \u4E2D\u5DF2\u5F03\u7528\u7684 `initialNavigation` \u9009\u9879\u5DF2\u88AB\u79FB\u9664\u3002\u5982\u679C\u4F60\u4EE5\u524D\u4F7F\u7528\u4E86 `enabled` \u6216 `true`\uFF0C\u73B0\u5728\u8BF7\u9009\u62E9 `enabledNonBlocking` \u6216 `enabledBlocking`\u3002\u5982\u679C\u4F60\u4EE5\u524D\u4F7F\u7528\u4E86 `false` \u6216 `legacy_disabled`\uFF0C\u73B0\u5728\u4F7F\u7528 `disabled`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"routerlink preserveQueryParams",action:'\u5728 Angular \u8DEF\u7531\u5668\u7684 `routerLink` \u4E2D\uFF0C\u5DF2\u5220\u9664\u4E86 `preserveQueryParams`\uFF0C\u8BF7\u4F7F\u7528 `queryParamsHandling="preserve"`\u3002'},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"routerlink queryParams typing",action:"\u5982\u679C\u4F60\u6B63\u5728\u8BBF\u95EE `routerLink` \u7684 `queryParams`\u3001`fragment` \u6216 `queryParamsHandling` \u503C\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u653E\u5BBD\u7C7B\u578B\u4EE5\u63A5\u53D7 `undefined` \u548C `null`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"viewencapsulation native removed",action:"\u7EC4\u4EF6\u89C6\u56FE\u5C01\u88C5\u9009\u9879 `ViewEncapsulation.Native` \u5DF2\u88AB\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 `ViewEncapsulation.ShadowDom`\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"ICU expressions typechecked",action:"\u5982\u679C\u4F60\u4F7F\u7528 i18n\uFF0C\u5728 International Components for Unicode (ICUs) \u8868\u8FBE\u5F0F\u4E2D\u7684\u8868\u8FBE\u5F0F\u73B0\u5728\u518D\u6B21\u8FDB\u884C\u7C7B\u578B\u68C0\u67E5\u3002\u5982\u679C\u5728 ICU \u4E2D\u7684\u8868\u8FBE\u5F0F\u4E2D\u53D1\u73B0\u9519\u8BEF\uFF0C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u7F16\u8BD1\u5931\u8D25\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"forms validators asyncValidators typing",action:"\u5728 `@angular/forms` \u5305\u4E2D\u7684\u6307\u4EE4\u6784\u9020\u51FD\u6570\u4E2D\uFF0C\u9884\u671F\u7684 `validators` \u548C `asyncValidators` \u53C2\u6570\u7684\u7C7B\u578B\u66FE\u7ECF\u662F `any[]`\u3002\u73B0\u5728\u8FD9\u4E9B\u53C2\u6570\u5DF2\u7ECF\u88AB\u6B63\u786E\u5730\u7C7B\u578B\u5316\uFF0C\u56E0\u6B64\u5982\u679C\u4F60\u7684\u4EE3\u7801\u4F9D\u8D56\u4E8E\u8868\u5355\u6307\u4EE4\u6784\u9020\u51FD\u6570\u7C7B\u578B\uFF0C\u53EF\u80FD\u9700\u8981\u4E00\u4E9B\u66F4\u65B0\u6765\u63D0\u9AD8\u7C7B\u578B\u5B89\u5168\u6027\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"forms AbstractFormControl",action:"\u5982\u679C\u4F60\u4F7F\u7528 Angular Forms\uFF0C`AbstractFormControl.parent` \u7684\u7C7B\u578B\u73B0\u5728\u5305\u62EC null\u3002`ng update` \u5C06\u81EA\u52A8\u8FC1\u79FB\u4F60\uFF0C\u4F46\u5728\u4E00\u4E2A\u4E0D\u592A\u53EF\u80FD\u7684\u60C5\u51B5\u4E0B\uFF0C\u5982\u679C\u4F60\u7684\u4EE3\u7801\u4F7F\u7528\u4E25\u683C\u76F8\u7B49\u5C06\u7236\u7EA7\u4E0E undefined \u8FDB\u884C\u6BD4\u8F83\uFF0C\u4F60\u9700\u8981\u6539\u4E3A\u4F7F\u7528 `=== null`\uFF0C\u56E0\u4E3A\u7236\u7EA7\u73B0\u5728\u660E\u786E\u521D\u59CB\u5316\u4E3A `null`\uFF0C\u800C\u4E0D\u662F\u4FDD\u7559\u4E3A undefined\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"platform-webworker",action:"\u5F88\u5C11\u4F7F\u7528\u7684 `@angular/platform-webworker` \u548C `@angular/platform-webworker-dynamic` \u5728 v8 \u4E2D\u5DF2\u88AB\u5F03\u7528\u5E76\u79FB\u9664\u3002\u5728 web worker \u4E2D\u8FD0\u884C Angular \u7684\u90E8\u5206\u662F\u4E00\u4E2A\u4ECE\u672A\u5BF9\u5E38\u89C1\u7528\u4F8B\u4EA7\u751F\u826F\u597D\u6548\u679C\u7684\u5B9E\u9A8C\u3002Angular \u5BF9 [Web Workers](https://angular.io/guide/web-worker) \u4ECD\u7136\u6709\u5F88\u597D\u7684\u652F\u6301\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 slice pipe typing",action:"\u73B0\u5728 `slice` \u7BA1\u9053\u5BF9\u4E8E\u672A\u5B9A\u4E49\u7684\u8F93\u5165\u503C\u8FD4\u56DE null\uFF0C\u8FD9\u4E0E\u5927\u591A\u6570\u7BA1\u9053\u7684\u884C\u4E3A\u4E00\u81F4\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 keyvalue typing",action:"\u4FEE\u590D\u4E86 `keyvalue` \u7BA1\u9053\uFF0C\u5BF9\u4E8E\u5177\u6709\u6570\u5B57\u952E\u7684\u8F93\u5165\u5BF9\u8C61\uFF0C\u7ED3\u679C\u7C7B\u578B\u5C06\u5305\u542B\u952E\u7684\u5B57\u7B26\u4E32\u8868\u793A\u5F62\u5F0F\u3002\u8FD9\u5DF2\u7ECF\u662F\u73B0\u5B9E\uFF0C\u4EE3\u7801\u5DF2\u7ECF\u66F4\u65B0\u4EE5\u53CD\u6620\u8FD9\u4E00\u70B9\u3002\u5982\u679C\u7BA1\u9053\u8F93\u51FA\u7684\u4F7F\u7528\u65B9\u4F9D\u8D56\u4E8E\u4E0D\u6B63\u786E\u7684\u7C7B\u578B\uFF0C\u8BF7\u66F4\u65B0\u3002\u8BF7\u6CE8\u610F\uFF0C\u8FD9\u4E0D\u4F1A\u5F71\u54CD\u8F93\u5165\u503C\u4E3A `Map` \u7684\u7528\u4F8B\uFF0C\u56E0\u6B64\u5982\u679C\u4F60\u9700\u8981\u4FDD\u7559 `number`\uFF0C\u8FD9\u662F\u4E00\u79CD\u6709\u6548\u7684\u65B9\u6CD5\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 number pipe typing",action:"\u6570\u5B57\u7BA1\u9053\uFF08`decimal`\u3001`percent`\u3001`currency` \u7B49\uFF09\u73B0\u5728\u660E\u786E\u6307\u5B9A\u63A5\u53D7\u7684\u7C7B\u578B\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 date pipe typing",action:"\u65E5\u671F\u7BA1\u9053\u73B0\u5728\u660E\u786E\u6307\u5B9A\u63A5\u53D7\u7684\u7C7B\u578B\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 datetime rounding",action:"\u5F53\u5C06\u5E26\u6709\u6BEB\u79D2\u5206\u6570\u7684\u65E5\u671F\u65F6\u95F4\u683C\u5F0F\u7684\u5B57\u7B26\u4E32\u4F20\u9012\u7ED9 `DatePipe` \u65F6\uFF0C\u6BEB\u79D2\u73B0\u5728\u603B\u662F\u5411\u4E0B\u820D\u5165\uFF0C\u800C\u4E0D\u662F\u820D\u5165\u5230\u6700\u8FD1\u7684\u6BEB\u79D2\u3002\u5927\u591A\u6570\u5E94\u7528\u7A0B\u5E8F\u4E0D\u4F1A\u53D7\u5230\u6B64\u66F4\u6539\u7684\u5F71\u54CD\u3002\u5982\u679C\u8FD9\u4E0D\u662F\u9884\u671F\u7684\u884C\u4E3A\uFF0C\u8003\u8651\u5728\u5C06\u5B57\u7B26\u4E32\u4F20\u9012\u7ED9 `DatePipe` \u4E4B\u524D\u9884\u5904\u7406\u6BEB\u79D2\u90E8\u5206\u4EE5\u820D\u5165\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 async pipe typing",action:"`async` \u7BA1\u9053\u4E0D\u518D\u58F0\u79F0\u5BF9\u4E8E\u7C7B\u578B\u4E3A undefined \u7684\u8F93\u5165\u8FD4\u56DE undefined\u3002\u8BF7\u6CE8\u610F\uFF0C\u4EE3\u7801\u5B9E\u9645\u4E0A\u5BF9\u4E8E\u672A\u5B9A\u4E49\u7684\u8F93\u5165\u8FD4\u56DE null\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"v11 case pipe update",action:"`uppercase` \u548C `lowercase` \u7BA1\u9053\u4E0D\u518D\u901A\u8FC7\u5047\u503C\u3002\u5B83\u4EEC\u73B0\u5728\u5C06 `null` \u548C `undefined` \u90FD\u6620\u5C04\u5230 `null`\uFF0C\u5E76\u5728\u65E0\u6548\u8F93\u5165\uFF08`0`\u3001`false`\u3001`NaN`\uFF09\u65F6\u5F15\u53D1\u5F02\u5E38\u3002\u8FD9\u4E0E\u5176\u4ED6 Angular \u7BA1\u9053\u7684\u884C\u4E3A\u76F8\u5339\u914D\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 router NavigationExtras typing",action:"\u5982\u679C\u4F60\u4F7F\u7528\u5E26\u6709 `NavigationExtras` \u7684\u8DEF\u7531\u5668\uFF0C\u65B0\u7684\u7C7B\u578B\u5141\u8BB8\u4F20\u9012\u7C7B\u578B\u4E3A `NavigationExtras` \u7684\u53D8\u91CF\uFF0C\u4F46\u4E0D\u5141\u8BB8\u5BF9\u8C61\u5B57\u9762\u91CF\uFF0C\u56E0\u4E3A\u5B83\u4EEC\u53EA\u80FD\u6307\u5B9A\u5DF2\u77E5\u5C5E\u6027\u3002\u5B83\u4EEC\u4E5F\u4E0D\u63A5\u53D7\u4E0E `Pick` \u4E2D\u7684\u5C5E\u6027\u6CA1\u6709\u5171\u540C\u5C5E\u6027\u7684\u7C7B\u578B\u3002\u5982\u679C\u4F60\u53D7\u5230\u6B64\u66F4\u6539\u7684\u5F71\u54CD\uFF0C\u8BF7\u4EC5\u6307\u5B9A\u5728\u76F8\u5E94\u51FD\u6570\u8C03\u7528\u4E2D\u5B9E\u9645\u4F7F\u7528\u7684 NavigationExtras \u4E2D\u7684\u5C5E\u6027\uFF0C\u6216\u5728\u5BF9\u8C61\u6216\u53D8\u91CF\u4E0A\u4F7F\u7528\u7C7B\u578B\u65AD\u8A00\uFF1A`as NavigationExtras`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"v11 TestBed.overrideProvider",action:"\u5982\u679C\u5728 TestBed \u521D\u59CB\u5316\u4E4B\u540E\u8C03\u7528 `TestBed.overrideProvider`\uFF0C\u5219\u4E0D\u518D\u5E94\u7528\u63D0\u4F9B\u8005\u8986\u76D6\u3002\u8FD9\u79CD\u884C\u4E3A\u4E0E\u5176\u4ED6\u8986\u76D6\u65B9\u6CD5\uFF08\u5982 `TestBed.overrideDirective` \u7B49\uFF09\u4E00\u81F4\uFF0C\u4F46\u4F1A\u5F15\u53D1\u9519\u8BEF\u4EE5\u6307\u793A\u3002\u4E4B\u524D\u5728 TestBed.overrideProvider \u51FD\u6570\u4E2D\u7F3A\u5C11\u6B64\u68C0\u67E5\u3002\u5982\u679C\u770B\u5230\u6B64\u9519\u8BEF\uFF0C\u8BF7\u786E\u4FDD\u5728 TestBed \u521D\u59CB\u5316\u5B8C\u6210\u4E4B\u524D\u79FB\u52A8 `TestBed.overrideProvider` \u8C03\u7528\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"v11 router RouteReuseStrategy",action:"\u5982\u679C\u4F60\u4F7F\u7528\u8DEF\u7531\u5668\u7684 RouteReuseStrategy\uFF0C\u53C2\u6570\u987A\u5E8F\u5DF2\u66F4\u6539\u3002\u5728\u8C03\u7528 `RouteReuseStrategy#shouldReuseRoute` \u65F6\uFF0C\u4EE5\u524D\u5728\u8BC4\u4F30\u5B50\u8DEF\u7531\u65F6\uFF0C\u4F1A\u8C03\u7528 `future` \u548C `current` \u53C2\u6570\u7684\u987A\u5E8F\u5DF2\u66F4\u6539\u3002\u5982\u679C\u4F60\u7684 `RouteReuseStrategy` \u4E13\u95E8\u4F9D\u8D56\u4E8E\u5C06\u6765\u6216\u5F53\u524D\u5FEB\u7167\u72B6\u6001\uFF0C\u53EF\u80FD\u9700\u8981\u66F4\u65B0 `shouldReuseRoute` \u5B9E\u73B0\u5BF9 `future` \u548C `current` `ActivateRouteSnapshots` \u7684\u4F7F\u7528\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 locale data readonly",action:"\u5982\u679C\u4F60\u4F7F\u7528\u533A\u57DF\u8BBE\u7F6E\u6570\u636E\u6570\u7EC4\uFF0C\u6B64 API \u73B0\u5728\u5C06\u8FD4\u56DE\u53EA\u8BFB\u6570\u7EC4\u3002\u5982\u679C\u4F60\u5BF9\u5176\u8FDB\u884C\u4E86\u66F4\u6539\uFF08\u4F8B\u5982\u8C03\u7528 `sort()`\u3001`push()`\u3001`splice()` \u7B49\uFF09\uFF0C\u90A3\u4E48\u4F60\u7684\u4EE3\u7801\u5C06\u4E0D\u518D\u7F16\u8BD1\u3002\u5982\u679C\u4F60\u9700\u8981\u66F4\u6539\u6570\u7EC4\uFF0C\u5219\u73B0\u5728\u5E94\u8BE5\u590D\u5236\u5B83\uFF08\u4F8B\u5982\u901A\u8FC7\u8C03\u7528 `slice()`\uFF09\u5E76\u66F4\u6539\u526F\u672C\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Advanced,step:"v11 CollectionChangeRecord",action:"\u5728\u53D8\u66F4\u68C0\u6D4B\u4E2D\uFF0C\u5DF2\u79FB\u9664\u4E86 `CollectionChangeRecord`\uFF0C\u8BF7\u6539\u7528 `IterableChangeRecord`\u3002"},{possibleIn:1100,necessaryAsOf:1100,level:e.Medium,step:"v11 forms async validators",action:"\u5982\u679C\u4F60\u5728 `FormControl`\u3001`FormGroup` \u6216 `FormArray` \u7684\u7C7B\u5B9E\u4F8B\u7684\u521D\u59CB\u5316\u65F6\u95F4\u4E0A\u4F7F\u7528\u5F02\u6B65\u9A8C\u8BC1\u5668\u6765\u5B9A\u4E49\uFF0C\u5219\u5728\u5F02\u6B65\u9A8C\u8BC1\u5668\u5B8C\u6210\u540E\u5148\u524D\u672A\u53D1\u51FA\u72B6\u6001\u66F4\u6539\u4E8B\u4EF6\u3002\u5DF2\u66F4\u6539\u4E3A\u5C06\u72B6\u6001\u4E8B\u4EF6\u53D1\u51FA\u5230 `statusChanges` \u53EF\u89C2\u5BDF\u5BF9\u8C61\u4E2D\u3002\u5982\u679C\u4F60\u7684\u4EE3\u7801\u4F9D\u8D56\u4E8E\u65E7\u884C\u4E3A\uFF0C\u4F60\u53EF\u4EE5\u8FC7\u6EE4/\u5FFD\u7565\u6B64\u989D\u5916\u7684\u72B6\u6001\u66F4\u6539\u4E8B\u4EF6\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Basic,step:"v12 ng update",action:"\u8FD0\u884C `ng update @angular/core@12 @angular/cli@12`\uFF0C\u8FD9\u5C06\u628A\u4F60\u7684 Angular \u7248\u672C\u5347\u7EA7\u5230 12\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@12`\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Basic,step:"v12 versions",action:"Angular \u73B0\u5728\u8981\u6C42 [TypeScript 4.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/)\u3002`ng update` \u5C06\u81EA\u52A8\u66F4\u65B0\u4F60\u7684 TypeScript\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Basic,step:"v12 browser support",action:"IE11 \u652F\u6301\u5DF2\u5F03\u7528\u3002\u5728 [IE11 \u5220\u9664 RFC](https://github.com/angular/angular/issues/41840) \u4E2D\u627E\u5230\u8BE6\u7EC6\u4FE1\u606F\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Basic,step:"v12 minimum Node.js version",action:"\u4F60\u4E0D\u80FD\u518D\u4F7F\u7528 Node.js \u7248\u672C 10 \u6216\u66F4\u65E9\u7684\u7248\u672C\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Medium,step:"v12 `XhrFactory` relocation",action:"\u5C06 `XhrFactory` \u7684\u5BFC\u5165\u4ECE `@angular/common/http` \u6539\u4E3A `@angular/common`\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Medium,step:"v12 i18n message ids",action:"\u5982\u679C\u4F60\u4F9D\u8D56\u4E8E\u65E7\u7248 i18n \u6D88\u606F ID\uFF0C\u8BF7\u4F7F\u7528 `localize-migrate` \u5DE5\u5177[\u8FC1\u79FB\u81F3\u65B0\u7248](https://angular.io/guide/migration-legacy-message-id)\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Medium,step:"v12 deprecates `emitDistinctChangesOnly`",action:"\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 `emitDistinctChangesOnly` \u6765\u914D\u7F6E `@ContentChildren` \u548C `@ViewChildren` \u67E5\u8BE2\uFF0C\u53EF\u80FD\u9700\u8981\u5C06\u5176\u503C\u66F4\u65B0\u4E3A `false` \u4EE5\u4E0E\u5176\u5148\u524D\u884C\u4E3A\u5BF9\u9F50\u3002\u5728 v12 \u4E2D\uFF0C`emitDistinctChangesOnly` \u7684\u9ED8\u8BA4\u503C\u4E3A `true`\uFF0C\u5728\u5C06\u6765\u7684\u7248\u672C\u4E2D\uFF0C\u6211\u4EEC\u5C06\u5220\u9664\u6B64\u914D\u7F6E\u9009\u9879\uFF0C\u4EE5\u9632\u6B62\u89E6\u53D1\u4E0D\u5FC5\u8981\u7684\u66F4\u6539\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Medium,step:"v12 prod by default",action:"\u4F60\u53EF\u4EE5\u8FD0\u884C\u53EF\u9009\u7684\u8FC1\u79FB\u4EE5\u5C06\u9ED8\u8BA4\u542F\u7528\u751F\u4EA7\u6784\u5EFA `ng update @angular/cli@12 --migrate-only production-by-default`\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 min and max form attributes",action:'\u5982\u679C\u4F60\u4F7F\u7528 Angular \u8868\u5355\uFF0C\u5728 `<input type="number">` \u4E0A\u4F7F\u7528 `min` \u548C `max` \u5C5E\u6027\u73B0\u5728\u5C06\u89E6\u53D1\u9A8C\u8BC1\u903B\u8F91\u3002'},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `emitEvent` in `FormArray` and `FormGroup`",action:"\u5982\u679C\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u5177\u6709\u81EA\u5B9A\u4E49\u7C7B\uFF0C\u5B83\u4EEC\u6269\u5C55\u4E86 `FormArray` \u6216 `FormGroup` \u7C7B\uFF0C\u5E76\u8986\u76D6\u4E86\u4E0A\u8FF0\u65B9\u6CD5\uFF0C\u5219\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u4F60\u7684\u5B9E\u73B0\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 zone.js minimum version",action:"\u5C06 zone.js \u66F4\u65B0\u5230\u7248\u672C 0.11.4\u3002`ng update` \u5C06\u81EA\u52A8\u66F4\u65B0\u6B64\u4F9D\u8D56\u9879\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `HttpParams` method params update",action:"\u5982\u679C\u4F60\u6269\u5C55\u4E86 `HttpParams` \u7C7B\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u5176\u65B9\u6CD5\u7684\u7B7E\u540D\u4EE5\u53CD\u6620\u53C2\u6570\u7C7B\u578B\u7684\u66F4\u6539\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `routerLinkActiveOptions`",action:"`RouterLinkActive` \u7684 `routerLinkActiveOptions` \u5C5E\u6027\u73B0\u5728\u5177\u6709\u66F4\u5177\u4F53\u7684\u7C7B\u578B\u3002\u4F60\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u8BBF\u95EE\u6B64\u5C5E\u6027\u7684\u4EE3\u7801\u4EE5\u4E0E\u66F4\u6539\u4FDD\u6301\u4E00\u81F4\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `APP_INITIALIZER` callback types",action:"\u521D\u59CB\u5316\u56DE\u8C03\u73B0\u5728\u5177\u6709\u66F4\u5177\u4F53\u7684\u8FD4\u56DE\u7C7B\u578B\uFF0C\u5982\u679C\u4F60\u901A\u8FC7 `Injector.get` \u6216 `TestBed.inject` \u83B7\u53D6 `APP_INITIALIZER` \u5B9E\u4F8B\uFF0C\u5219\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 fragment typings",action:"\u8DEF\u7531\u5668\u7247\u6BB5\u73B0\u5728\u53EF\u80FD\u662F `null`\u3002\u6DFB\u52A0 `null` \u68C0\u67E5\u4EE5\u907F\u514D TypeScript \u4EA7\u751F\u7C7B\u578B\u9519\u8BEF\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `ng.getDirectives`",action:"\u786E\u4FDD\u4E0D\u4F9D\u8D56\u4E8E `ng.getDirectives` \u5982\u679C\u627E\u4E0D\u5230\u4E0E\u7279\u5B9A DOM \u8282\u70B9\u76F8\u5173\u8054\u7684\u6307\u4EE4\uFF0C\u5219\u5F15\u53D1\u9519\u8BEF\u3002"},{possibleIn:1200,necessaryAsOf:1200,level:e.Advanced,step:"v12 `optimization.styles.inlineCritical`",action:"\u68C0\u67E5\u4F60\u7684 angular.json \u6587\u4EF6\u4E2D\u7684 `optimization.styles.inlineCritical` \u9009\u9879\u3002\u73B0\u5728\u9ED8\u8BA4\u4E3A `true`\u3002\u8BF7\u8BB0\u4F4F\uFF0C\u6574\u4E2A `optimization` \u9009\u9879\u53EF\u4EE5\u8BBE\u7F6E\u4E3A\u5E03\u5C14\u503C\uFF0C\u8FD9\u5C06\u5C06\u6240\u6709\u5B50\u9009\u9879\u8BBE\u7F6E\u4E3A\u9ED8\u8BA4\u503C\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Basic,step:"v13 ng update",action:"\u8FD0\u884C `ng update @angular/core@13 @angular/cli@13` \u5C06\u4F60\u7684 Angular \u7248\u672C\u66F4\u65B0\u81F3 13\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@13`\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Basic,step:"TypeScript 4.4",action:"Angular \u73B0\u5728\u4F7F\u7528 TypeScript 4.4\uFF0C\u8BF7\u9605\u8BFB\u6709\u5173\u4EFB\u4F55\u6F5C\u5728\u53D8\u66F4\u7684\u66F4\u591A\u4FE1\u606F\uFF1A[TypeScript 4.4 \u53D1\u5E03\u8BF4\u660E](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html)"},{possibleIn:1300,necessaryAsOf:1300,level:e.Basic,step:"v13 node",action:'\u786E\u4FDD\u4F60\u4F7F\u7528\u7684\u662F <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 12.20.0 \u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:1300,necessaryAsOf:1300,level:e.Medium,step:"v13 routerLink",action:"\u73B0\u5728\u53EF\u4EE5\u901A\u8FC7\u4F20\u9012 `undefined` \u548C `null` \u6765\u7981\u7528 `routerLink` \u7684\u5BFC\u822A\u3002\u4E4B\u524D\uFF0C`routerLink` \u6307\u4EE4\u63A5\u53D7\u8FD9\u4E24\u4E2A\u503C\u7B49\u540C\u4E8E\u7A7A\u5B57\u7B26\u4E32\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Medium,step:"v13 router loadChildren",action:"\u4E0D\u80FD\u518D\u901A\u8FC7\u5C06\u5B57\u7B26\u4E32\u503C\u8BBE\u7F6E\u4E3A `loadChildren` \u6765\u6307\u5B9A\u60F0\u6027\u52A0\u8F7D\u7684\u8DEF\u7531\u3002\u786E\u4FDD\u5207\u6362\u5230\u52A8\u6001 ESM \u5BFC\u5165\u8BED\u53E5\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Medium,step:"v13 service worker activated",action:"`SwUpdate` \u7684 `activated` \u53EF\u89C2\u5BDF\u5BF9\u8C61\u73B0\u5DF2\u5F03\u7528\u3002\u8981\u68C0\u67E5\u670D\u52A1\u5DE5\u4F5C\u5668\u7684\u6FC0\u6D3B\u72B6\u6001\uFF0C\u8BF7\u6539\u7528 `activatedUpdate` \u65B9\u6CD5\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Medium,step:"v13 service worker available",action:"`SwUpdate` \u7684 `available` \u53EF\u89C2\u5BDF\u5BF9\u8C61\u73B0\u5DF2\u5F03\u7528\u3002\u8981\u83B7\u53D6\u76F8\u540C\u7684\u4FE1\u606F\uFF0C\u8BF7\u4F7F\u7528 `versionUpdates` \u5E76\u4EC5\u8FC7\u6EE4 `VersionReadyEvent` \u4E8B\u4EF6\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Medium,step:"v13 renderModuleFactory",action:"`@angular/platform-server` \u4E2D\u7684 `renderModuleFactory` \u4E0D\u518D\u4E0E Ivy \u4E00\u8D77\u4F7F\u7528\u3002\u6539\u7528 `renderModule`\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,step:"v13 forms status",action:"\u6211\u4EEC\u5C06 `AbstractControl.status` \u7684\u7C7B\u578B\u7F29\u5C0F\u4E3A `FormControlStatus`\uFF0C\u5E76\u5C06 `AbstractControl.status` \u7684\u7C7B\u578B\u7F29\u5C0F\u4E3A `Observable<FormControlStatus>`\u3002 `FormControlStatus` \u662F\u8868\u5355\u63A7\u4EF6\u7684\u6240\u6709\u53EF\u80FD\u72B6\u6001\u5B57\u7B26\u4E32\u7684\u8054\u5408\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,step:"v13 router serializer",action:"\u73B0\u5728\uFF0CURL \u5E8F\u5217\u5316\u7A0B\u5E8F\u9075\u5B88 URI \u89C4\u8303\uFF0C\u4F1A\u8003\u8651\u67E5\u8BE2\u53C2\u6570\u4E2D\u7684\u95EE\u53F7\u3002\u4F8B\u5982\uFF0C`/path?q=hello?&q2=2` \u73B0\u5728\u5C06\u89E3\u6790\u4E3A `{ q: `hello?`, q2: 2 }`\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,step:"v13 host binding",action:"`href` \u73B0\u5728\u662F\u5C5E\u6027\u7ED1\u5B9A\u3002\u8FD9\u610F\u5473\u7740 `DebugElement.properties['href']` \u73B0\u5728\u8FD4\u56DE\u539F\u751F\u5143\u7D20\u8FD4\u56DE\u7684 `href` \u503C\uFF0C\u800C\u4E0D\u662F `routerLink` \u7684 `href` \u5C5E\u6027\u7684\u5185\u90E8\u503C\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,step:"v13 spy location",action:"`SpyLocation` \u5728\u8C03\u7528 `location.go` \u65F6\u4E0D\u518D\u89E6\u53D1 `popstate` \u4E8B\u4EF6\u3002\u6B64\u5916\uFF0C`simulateHashChange` \u73B0\u5728\u89E6\u53D1 `haschange` \u548C `popstate`\u3002\u4F9D\u8D56\u4E8E `location.go` \u7684\u6D4B\u8BD5\u73B0\u5728\u53EF\u80FD\u9700\u8981\u4F7F\u7528 `simulateHashChange` \u6765\u6355\u83B7 `popstate`\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,ngUpgrade:true,step:"v13 router URL replacement",action:"\u5F53\u65B0\u5BFC\u822A\u53D6\u6D88\u6B63\u5728\u8FDB\u884C\u7684\u5BFC\u822A\u65F6\uFF0C\u8DEF\u7531\u5668\u5C06\u4E0D\u518D\u66FF\u6362\u6D4F\u89C8\u5668 URL\u3002\u4F9D\u8D56\u4E8E Angular \u8DEF\u7531\u5668\u5904\u7406\u7684\u521D\u59CB\u5BFC\u822A\u4E0A\u5B58\u5728 `navigationId` \u7684\u6DF7\u5408\u5E94\u7528\u7A0B\u5E8F\u5E94\u8BE5\u8BA2\u9605 `NavigationCancel` \u4E8B\u4EF6\uFF0C\u5E76\u6267\u884C `location.replaceState` \u4EE5\u5C06 `navigationId` \u6DFB\u52A0\u5230 `Router` \u72B6\u6001\u4E2D\u3002\u6B64\u5916\uFF0C\u65AD\u8A00 `SpyLocation` \u4E0A\u7684 `urlChanges` \u7684\u6D4B\u8BD5\u53EF\u80FD\u9700\u8981\u8C03\u6574\u4EE5\u8003\u8651\u4E0D\u518D\u89E6\u53D1\u7684 `replaceState`\u3002"},{possibleIn:1300,necessaryAsOf:1300,level:e.Advanced,step:"v13 removed symbols",action:"\u8DEF\u7531\u5668\u5305\u4E0D\u518D\u5BFC\u51FA `SpyNgModuleFactoryLoader` \u548C `DeprecatedLoadChildren`\u3002\u5982\u679C\u4F7F\u7528\u4E86\u5B83\u4EEC\uFF0C\u8BF7\u786E\u4FDD\u5220\u9664\u5176\u5BF9\u5E94\u7684\u5BFC\u5165\u8BED\u53E5\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Basic,step:"v14 ng update",action:"\u8FD0\u884C `ng update @angular/core@14 @angular/cli@14` \u5C06\u4F60\u7684 Angular \u7248\u672C\u66F4\u65B0\u81F3 14\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@14`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Basic,step:"TypeScript 4.6",action:"Angular \u73B0\u5728\u4F7F\u7528 TypeScript 4.6\uFF0C\u8BF7\u9605\u8BFB\u6709\u5173\u4EFB\u4F55\u6F5C\u5728\u53D8\u66F4\u7684\u66F4\u591A\u4FE1\u606F\uFF1A[TypeScript 4.6 \u53D1\u5E03\u516C\u544A](https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/)"},{possibleIn:1400,necessaryAsOf:1400,level:e.Basic,step:"v14 node",action:'\u786E\u4FDD\u4F60\u4F7F\u7528\u7684\u662F <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 14.15.0 \u6216\u66F4\u9AD8\u7248\u672C</a>\u3002'},{possibleIn:1400,necessaryAsOf:1400,level:e.Medium,step:"v14 strict forms",action:"\u8868\u5355\u6A21\u578B\u73B0\u5728\u9700\u8981\u4E00\u4E2A\u6CDB\u578B\u7C7B\u578B\u53C2\u6570\u3002\u4F60\u53EF\u4EE5\u9009\u62E9\u4F7F\u7528\u8868\u5355\u6A21\u578B\u7C7B\u7684\u4E0D\u5E26\u7C7B\u578B\u7684\u7248\u672C\u8FDB\u884C\u6E10\u8FDB\u5F0F\u8FC1\u79FB\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Medium,step:"v14 aotSummaries",action:"\u4ECE `TestBed` \u4E2D\u5220\u9664 `aotSummaries`\uFF0C\u56E0\u4E3A Angular \u4E0D\u518D\u5728 Ivy \u4E2D\u9700\u8981\u5B83\u4EEC\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Medium,material:true,step:"v14 MatVertical and Horizontal Stepper",action:"\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 `MatVerticalStepper` \u6216 `MatHorizontalStepper`\uFF0C\u8BF7\u786E\u4FDD\u5207\u6362\u5230 `MatStepper`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Medium,step:"v14 JSONP",action:"\u4ECE JSONP \u8BF7\u6C42\u4E2D\u5220\u9664\u5934\u90E8\u3002JSONP \u4E0D\u652F\u6301\u5934\u90E8\uFF0C\u5982\u679C\u6307\u5B9A\u4E86\u5934\u90E8\uFF0CHTTP \u6A21\u5757\u73B0\u5728\u5C06\u629B\u51FA\u9519\u8BEF\u800C\u4E0D\u662F\u5FFD\u7565\u5B83\u4EEC\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Medium,step:"v14 resolvers",action:"\u89E3\u6790\u5668\u73B0\u5728\u5C06\u63A5\u6536\u5230\u7684 observable \u7684\u7B2C\u4E00\u4E2A\u53D1\u5C04\u503C\uFF0C\u5E76\u5728\u6B64\u4E4B\u540E\u8FDB\u884C\u5BFC\u822A\uFF0C\u4EE5\u66F4\u597D\u5730\u4E0E\u5176\u4ED6\u5B88\u536B\u4FDD\u6301\u4E00\u81F4\uFF0C\u800C\u4E0D\u662F\u53D6\u6700\u540E\u53D1\u5C04\u7684\u503C\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 deprecate protractor entry",action:"\u5DF2\u79FB\u9664\u5E9F\u5F03\u7684 `angular/cdk/testing/protractor` \u5165\u53E3\u70B9\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 chipInput",action:"\u786E\u4FDD\u6307\u5B9A `MatChipInputEvent` \u7684 `chipInput`\uFF0C\u56E0\u4E3A\u73B0\u5728\u5B83\u662F\u5FC5\u9700\u7684\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 mixinErrorState",action:"\u5728\u4F7F\u7528 `mixinErrorState` \u7684\u62BD\u8C61\u7C7B\u4E2D\uFF0C\u4F60\u9700\u8981\u5B9E\u73B0 `stateChanges` \u7C7B\u6210\u5458\uFF0C\u56E0\u4E3A mixin \u4E0D\u518D\u63D0\u4F9B\u5B83\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 CdkStepper orientation",action:"\u4F7F\u7528 `CdkStepper.orientation`\uFF0C\u800C\u4E0D\u662F `CdkStepper._orientation`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 CdkStepper and MatStepper",action:"\u5982\u679C\u4F60\u5728\u6784\u9020\u51FD\u6570\u4E2D\u6269\u5C55\u6216\u4F7F\u7528 `CdkStepper` \u6216 `MatStepper`\uFF0C\u5219\u4E0D\u518D\u9700\u8981\u4F20\u9012 `_document` \u53C2\u6570\uFF0C\u56E0\u4E3A\u5B83\u73B0\u5728\u5DF2\u88AB\u79FB\u9664\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 mat-list-item-avatar",action:"\u5C06 `mat-list-item-avatar` CSS \u7C7B\u91CD\u547D\u540D\u4E3A `mat-list-item-with-avatar`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 MatSelectionListChange.option",action:"\u4F7F\u7528 `MatSelectionListChange.options`\uFF0C\u800C\u4E0D\u662F `MatSelectionListChange.option`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 getHarnessLoaderForContent",action:"\u4F7F\u7528 `getChildLoader(MatListItemSection.CONTENT)`\uFF0C\u800C\u4E0D\u662F `getHarnessLoaderForContent`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:true,step:"v14 MatSelectionList",action:"\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 `MatSelectionList`\uFF0C\u8BF7\u786E\u4FDD\u5728\u5176\u6784\u9020\u51FD\u6570\u4E2D\u4F20\u9012 `_focusMonitor`\uFF0C\u56E0\u4E3A\u73B0\u5728\u5B83\u662F\u5FC5\u9700\u7684\u3002\u6B64\u5916\uFF0C\u8FD9\u4E2A\u7C7B\u4E0D\u518D\u5177\u6709 `tabIndex` \u5C5E\u6027\u548C `tabIndex` \u6784\u9020\u51FD\u6570\u53C2\u6570\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 initialNavigation",action:"\u5C06 `initialNavigation: 'enabled'` \u66F4\u65B0\u4E3A `initialNavigation: 'enabledBlocking'`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 Route.pathMatch",action:"\u5982\u679C\u4F60\u6B63\u5728\u5B9A\u4E49\u5E26\u6709 `pathMatch` \u7684\u8DEF\u7531\uFF0C\u53EF\u80FD\u9700\u8981\u5C06\u5176\u663E\u5F0F\u8F6C\u6362\u4E3A `Route` \u6216 `Routes`\u3002`Route.pathMatch` \u4E0D\u518D\u517C\u5BB9 `string` \u7C7B\u578B\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 stricter LoadChildrenCallback",action:"`LoadChildrenCallback` \u8FD4\u56DE\u7684 Promise \u73B0\u5728\u5177\u6709\u66F4\u4E25\u683C\u7684\u7C7B\u578B\u53C2\u6570 `Type<any>|NgModuleFactory<any>`\uFF0C\u800C\u4E0D\u662F `any`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 router scheduling",action:"\u8DEF\u7531\u5668\u4E0D\u518D\u5728 `setTimeout` \u5185\u5B89\u6392\u91CD\u5B9A\u5411\u5BFC\u822A\u3002\u786E\u4FDD\u4F60\u7684\u6D4B\u8BD5\u4E0D\u4F9D\u8D56\u4E8E\u8FD9\u79CD\u884C\u4E3A\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 LocationStrategy",action:"\u73B0\u5728\u5B9E\u73B0 `LocationStrategy` \u63A5\u53E3\u9700\u8981\u5B9A\u4E49 `getState()`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 http queries",action:"\u53D1\u9001\u67E5\u8BE2\u65F6\u4E0D\u518D\u9700\u8981\u5BF9 `+` \u8FDB\u884C\u5904\u7406\uFF0C\u56E0\u4E3A `+` \u4E0D\u518D\u53D1\u9001\u7A7A\u683C\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 AnimationDriver.getParentElement",action:"\u73B0\u5728\u5B9E\u73B0 `AnimationDriver` \u9700\u8981 `getParentElement` \u65B9\u6CD5\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 invalid config",action:"\u61D2\u52A0\u8F7D\u6A21\u5757\u7684\u65E0\u6548\u8DEF\u7531\u914D\u7F6E\u73B0\u5728\u4F1A\u5F15\u53D1\u9519\u8BEF\uFF0C\u800C\u4E0D\u662F\u88AB\u5FFD\u7565\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 router resolver",action:"\u4ECE `RouterOutletContract.activateWith` \u51FD\u6570\u4E2D\u79FB\u9664 `resolver`\uFF0C\u4EE5\u53CA\u4ECE `OutletContext` \u7C7B\u4E2D\u79FB\u9664 `resolver`\uFF0C\u56E0\u4E3A\u4E0D\u518D\u9700\u8981\u5DE5\u5382\u89E3\u6790\u5668\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,step:"v14 initialUrl",action:"`Router.initialUrl` \u53EA\u63A5\u53D7 `UrlTree`\uFF0C\u4EE5\u9632\u6B62\u901A\u8FC7\u5206\u914D `string` \u503C\u6765\u8BEF\u7528 API\u3002"},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 base-decorators",action:'\u786E\u4FDD\u5728\u5177\u6709\u7EE7\u627F\u6784\u9020\u51FD\u6570\u548C\u4F7F\u7528\u4F9D\u8D56\u6CE8\u5165\u7684\u5B50\u7C7B\u4E2D\u4F7F\u7528\u57FA\u7C7B\u4E2D\u7684\u88C5\u9970\u5668\u3002\u8FD9\u6837\u7684\u57FA\u7C7B\u5E94\u8BE5\u7528 `@Injectable` \u6216 `@Directive` \u88C5\u9970\uFF0C\u5426\u5219\u7F16\u8BD1\u5668\u4F1A\u8FD4\u56DE\u9519\u8BEF\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-05" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 setDisabledState",action:'\u5728 v15 \u4E2D\uFF0C\u5F53\u9644\u52A0 `ControlValueAccessor` \u65F6\uFF0C\u59CB\u7EC8\u8C03\u7528 `setDisabledState`\u3002\u8981\u9000\u51FA\u6B64\u884C\u4E3A\uFF0C\u4F7F\u7528 `FormsModule.withConfig` \u6216 `ReactiveFormsModule.withConfig`\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-06" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Advanced,step:"v15 canParse",action:'\u4F7F\u7528 `canParse` \u7684\u5E94\u7528\u7A0B\u5E8F\u5E94\u8BE5\u6539\u4E3A\u4F7F\u7528 `@angular/localize/tools` \u4E2D\u7684 `analyze`\u3002\u5728 v15 \u4E2D\uFF0C\u4ECE `@angular/localize/tools` \u7684\u6240\u6709\u7FFB\u8BD1\u89E3\u6790\u5668\u4E2D\u5220\u9664\u4E86 `canParse` \u65B9\u6CD5\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-07" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,step:"v15 ActivatedRoutSnapshot",action:'\u786E\u4FDD\u6240\u6709 `ActivatedRouteSnapshot` \u5BF9\u8C61\u90FD\u6709 `title` \u5C5E\u6027\u3002\u5728 v15 \u4E2D\uFF0C`title` \u5C5E\u6027\u662F `ActivatedRouteSnapshot` \u7684\u5FC5\u9700\u5C5E\u6027\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-08" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Advanced,step:"v15 RouterOutlet",action:'\u5982\u679C\u4F60\u7684 `RouterOutlet` \u6D4B\u8BD5\u51FA\u73B0\u95EE\u9898\uFF0C\u8BF7\u786E\u4FDD\u5B83\u4EEC\u4E0D\u4F9D\u8D56\u4E8E\u4E0E\u53D8\u66F4\u68C0\u6D4B\u76F8\u5173\u7684\u76F8\u5E94\u7EC4\u4EF6\u7684\u5B9E\u4F8B\u5316\u987A\u5E8F\u3002\u5728 v15 \u4E2D\uFF0C`RouterOutlet` \u5728\u53D8\u66F4\u68C0\u6D4B\u4E4B\u540E\u5B9E\u4F8B\u5316\u7EC4\u4EF6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-09" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,step:"v15 relativeLinkResolution",action:'\u5728 v15 \u4E2D\uFF0C`relativeLinkResolution` \u5728\u8DEF\u7531\u5668\u4E2D\u4E0D\u53EF\u914D\u7F6E\u3002\u5B83\u7528\u4E8E\u9000\u51FA\u5148\u524D\u7684\u9519\u8BEF\u4FEE\u590D\uFF0C\u73B0\u5728\u5DF2\u6210\u4E3A\u6807\u51C6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-10" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 DATE_PIPE_DEFAULT_OPTIONS",action:'\u5C06 `DATE_PIPE_DEFAULT_TIMEZONE` \u4EE4\u724C\u7684\u5B9E\u4F8B\u66F4\u6539\u4E3A\u4F7F\u7528 `DATE_PIPE_DEFAULT_OPTIONS` \u914D\u7F6E\u65F6\u533A\u3002\u5728 v15 \u4E2D\uFF0C`DATE_PIPE_DEFAULT_TIMEZONE` \u4EE4\u724C\u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 iframe",action:"\u73B0\u6709\u7684 `<iframe>` \u5B9E\u4F8B\u53EF\u80FD\u5DF2\u7ECF\u5E94\u7528\u4E86\u5B89\u5168\u654F\u611F\u5C5E\u6027\uFF0C\u4F5C\u4E3A\u5C5E\u6027\u6216\u5C5E\u6027\u7ED1\u5B9A\u3002\u8FD9\u4E9B\u5B89\u5168\u654F\u611F\u5C5E\u6027\u53EF\u80FD\u51FA\u73B0\u5728\u6A21\u677F\u4E2D\u6216\u6307\u4EE4\u7684\u5BBF\u4E3B\u7ED1\u5B9A\u4E2D\u3002\u8FD9\u4E9B\u60C5\u51B5\u9700\u8981\u66F4\u65B0\uFF0C\u4EE5\u786E\u4FDD\u7B26\u5408\u5BF9 `<iframe>` \u7ED1\u5B9A\u7684\u65B0\u548C\u66F4\u4E25\u683C\u7684\u89C4\u5219\u3002<a href='https://v15.angular.io/errors/NG0910' title='\u9519\u8BEF\u9875\u9762\u7684\u94FE\u63A5'>\u67E5\u770B\u66F4\u591A\u4FE1\u606F</a>"},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 Injector.get",action:'\u66F4\u65B0\u4F7F\u7528 `InjectFlags` \u53C2\u6570\u7684 `Injector.get()` \u7684\u5B9E\u4F8B\uFF0C\u4EE5\u4F7F\u7528 `InjectOptions` \u53C2\u6570\u3002\u5728 v15 \u4E2D\uFF0C`Injector.get()` \u7684 `InjectFlags` \u53C2\u6570\u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-02" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,step:"v15 TestBed.inject",action:'\u66F4\u65B0\u4F7F\u7528 `InjectFlags` \u53C2\u6570\u7684 `TestBed.inject()` \u7684\u5B9E\u4F8B\uFF0C\u4EE5\u4F7F\u7528 `InjectOptions` \u53C2\u6570\u3002\u5728 v15 \u4E2D\uFF0C`TestBed.inject()` \u7684 `InjectFlags` \u53C2\u6570\u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 ngModule in providedIn",action:'\u5728 v15 \u4E2D\uFF0C\u5BF9 `@Injectable` \u548C `InjectionToken` \u4F7F\u7528 `providedIn: ngModule` \u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-04" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,step:"v15 providedIn any",action:'\u5728 v15 \u4E2D\uFF0C\u5BF9 `@Injectable` \u6216 `InjectionToken` \u4F7F\u7528 `providedIn: \'any\'` \u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-05" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Medium,step:"v15 RouterLinkWithHref",action:'\u66F4\u65B0 `RouterLinkWithHref` \u6307\u4EE4\u7684\u5B9E\u4F8B\u4EE5\u4F7F\u7528 `RouterLink` \u6307\u4EE4\u3002`RouterLinkWithHref` \u6307\u4EE4\u5728 v15 \u4E2D\u5DF2\u8FC7\u65F6\u3002<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-06" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,material:true,step:"v15 mat refactor",action:'\u5728 Angular Material v15 \u4E2D\uFF0C\u8BB8\u591A\u7EC4\u4EF6\u5DF2\u88AB\u91CD\u6784\u4E3A\u57FA\u4E8E\u5B98\u65B9 Material Design Components for Web (MDC)\u3002\u8FD9\u4E2A\u53D8\u5316\u5F71\u54CD\u4E86\u8BB8\u591A\u7EC4\u4EF6\u7684 DOM \u548C CSS \u7C7B\u3002<a href="https://rc.material.angular.io/guide/mdc-migration" title="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,step:"v15 visual review",action:"\u5728\u5C06\u5E94\u7528\u7A0B\u5E8F\u66F4\u65B0\u5230 v15 \u540E\uFF0C\u901A\u8FC7\u89C6\u89C9\u5BA1\u67E5\u5E94\u7528\u7A0B\u5E8F\u53CA\u5176\u4EA4\u4E92\uFF0C\u786E\u4FDD\u4E00\u5207\u6B63\u5E38\u8FD0\u884C\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 node support",action:"\u786E\u4FDD\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\u4F7F\u7528\u53D7\u652F\u6301\u7684 node.js \u7248\u672C\u3002Angular v16 \u652F\u6301 node.js \u7248\u672C\uFF1Av16 \u548C v18\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 ts support",action:"\u786E\u4FDD\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\u4F7F\u7528\u53D7\u652F\u6301\u7684 TypeScript \u7248\u672C\u3002Angular v16 \u652F\u6301 TypeScript \u7248\u672C 4.9.3 \u6216\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 ng update",action:"\u5728\u5E94\u7528\u7A0B\u5E8F\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\uFF0C\u8FD0\u884C `ng update @angular/core@16 @angular/cli@16`\uFF0C\u5C06\u5E94\u7528\u7A0B\u5E8F\u66F4\u65B0\u5230 Angular v16\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@16`\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 zone.js support",action:"\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\uFF0C\u8BF7\u786E\u4FDD\u4F7F\u7528\u53D7\u652F\u6301\u7684 Zone.js \u7248\u672C\u3002Angular v16 \u652F\u6301 Zone.js \u7248\u672C 0.13.x \u6216\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 RouterEvent",action:"Event \u8054\u5408\u4F53\u4E0D\u518D\u5305\u542B `RouterEvent`\uFF0C\u8FD9\u610F\u5473\u7740\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Event \u7C7B\u578B\uFF0C\u5219\u53EF\u80FD\u5FC5\u987B\u5C06\u7C7B\u578B\u5B9A\u4E49\u4ECE `(e: Event)` \u66F4\u6539\u4E3A `(e: Event|RouterEvent)`"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 routerEvent prop type",action:"\u9664\u4E86 `NavigationEnd`\uFF0C`routerEvent` \u5C5E\u6027\u73B0\u5728\u8FD8\u63A5\u53D7\u7C7B\u578B `NavigationSkipped`"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 RendererType2",action:"\u4EC5\u5C06\u6241\u5E73\u6570\u7EC4\u4F20\u9012\u7ED9 `RendererType2.styles`\uFF0C\u56E0\u4E3A\u5B83\u4E0D\u518D\u63A5\u53D7\u5D4C\u5957\u6570\u7EC4"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 BrowserPlatformLocation",action:"\u4F60\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u4F7F\u7528 `BrowserPlatformLocation` \u7684\u6D4B\u8BD5\uFF0C\u56E0\u4E3A `MockPlatformLocation` \u73B0\u5728\u9ED8\u8BA4\u5728\u6D4B\u8BD5\u4E2D\u63D0\u4F9B\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-9)"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 ngcc",action:"\u7531\u4E8E\u5728 v16 \u4E2D\u5220\u9664\u4E86 Angular Compatibility Compiler (ngcc)\uFF0C\u56E0\u6B64 v16 \u53CA\u66F4\u9AD8\u7248\u672C\u7684\u9879\u76EE\u4E0D\u518D\u652F\u6301 View Engine \u5E93\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 createUrlTree",action:"\u5728 `Router.createUrlTree` \u4E2D\u7684\u9519\u8BEF\u4FEE\u590D\u540E\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u8C03\u6574\u6A21\u62DF `ActivatedRoute` \u7684\u6D4B\u8BD5\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#1600-2023-05-03)"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 ApplicationConfig imports",action:"\u5C06 `ApplicationConfig` \u7684\u5BFC\u5165\u66F4\u6539\u4E3A\u6765\u81EA `@angular/core`\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 renderModule",action:"\u4FEE\u6539\u4EE3\u7801\u4EE5\u4F7F\u7528 `renderModule` \u800C\u4E0D\u662F `renderModuleFactory`\uFF0C\u56E0\u4E3A\u540E\u8005\u5DF2\u88AB\u5220\u9664\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 XhrFactory",action:"\u4FEE\u6539\u4EE3\u7801\uFF0C\u4F7F\u7528 `@angular/common` \u4E2D\u7684 `XhrFactory` \u800C\u4E0D\u662F\u6765\u81EA `@angular/common/http` \u7684 `XhrFactory`\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 withServerTransition",action:"\u5982\u679C\u4F60\u5728\u540C\u4E00\u9875\u4E0A\u8FD0\u884C\u591A\u4E2A Angular \u5E94\u7528\u7A0B\u5E8F\uFF0C\u5E76\u4E14\u4F7F\u7528\u4E86 `BrowserModule.withServerTransition({ appId: 'serverApp' })`\uFF0C\u8BF7\u786E\u4FDD\u8BBE\u7F6E `APP_ID`\uFF0C\u56E0\u4E3A `withServerTransition` \u73B0\u5DF2\u8FC7\u65F6\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-browser-4)"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 EnvironmentInjector",action:"\u5C06 `EnvironmentInjector.runInContext` \u66F4\u6539\u4E3A `runInInjectionContext`\uFF0C\u5E76\u5C06\u73AF\u5883\u6CE8\u5165\u5668\u4F5C\u4E3A\u7B2C\u4E00\u4E2A\u53C2\u6570\u4F20\u9012\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 ViewContainerRef.createComponent",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u4F7F\u7528 `ViewContainerRef.createComponent` \u800C\u4E0D\u4F7F\u7528\u5DE5\u5382\u89E3\u6790\u5668\u3002`ComponentFactoryResolver` \u5DF2\u4ECE Router API \u4E2D\u79FB\u9664\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 APP_ID",action:"\u5982\u679C\u5728\u540C\u4E00\u9875\u4E0A\u5F15\u5BFC\u591A\u4E2A\u5E94\u7528\u7A0B\u5E8F\uFF0C\u8BF7\u786E\u4FDD\u8BBE\u7F6E\u552F\u4E00\u7684 `APP_IDs`\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 server renderApplication",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u4FEE\u8BA2 `renderApplication` \u65B9\u6CD5\uFF0C\u56E0\u4E3A\u5B83\u4E0D\u518D\u63A5\u53D7\u6839\u7EC4\u4EF6\u4F5C\u4E3A\u7B2C\u4E00\u4E2A\u53C2\u6570\uFF0C\u800C\u662F\u5E94\u8BE5\u5F15\u5BFC\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u7684\u56DE\u8C03\u51FD\u6570\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-server-3)"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 PlatformConfig.baseUrl",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u5220\u9664\u5BF9 `PlatformConfig.baseUrl` \u548C `PlatformConfig.useAbsoluteUrl` platform-server \u914D\u7F6E\u9009\u9879\u7684\u4EFB\u4F55\u5F15\u7528\uFF0C\u56E0\u4E3A\u5B83\u5DF2\u88AB\u5F03\u7528\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 moduleid",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u5220\u9664\u5BF9 `@Directive`/`@Component` `moduleId` \u5C5E\u6027\u7684\u4EFB\u4F55\u5F15\u7528\uFF0C\u56E0\u4E3A\u5B83\u4E0D\u8D77\u4F5C\u7528\uFF0C\u5C06\u5728 v17 \u4E2D\u5220\u9664\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 transfer state imports",action:"\u4ECE `import {makeStateKey, StateKey, TransferState} from '@angular/platform-browser'` \u66F4\u65B0\u5BFC\u5165\u5230 `import {makeStateKey, StateKey, TransferState} from '@angular/core'`"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 ComponentRef",action:"\u5982\u679C\u4F9D\u8D56\u4E8E `ComponentRef.setInput` \u6765\u8BBE\u7F6E\u7EC4\u4EF6\u8F93\u5165\uFF0C\u5373\u4F7F\u5B83\u57FA\u4E8E `Object.is` \u76F8\u7B49\u6027\u68C0\u67E5\u662F\u76F8\u540C\u7684\uFF0C\u8BF7\u786E\u4FDD\u590D\u5236\u5176\u503C\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 ANALYZE_FOR_ENTRY_COMPONENTS",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u5220\u9664\u5BF9 `ANALYZE_FOR_ENTRY_COMPONENTS` \u6CE8\u5165\u4EE4\u724C\u7684\u4EFB\u4F55\u5F15\u7528\uFF0C\u56E0\u4E3A\u5B83\u5DF2\u88AB\u5220\u9664\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 entry components",action:"`entryComponents` \u4E0D\u518D\u53EF\u7528\uFF0C\u5E76\u4E14\u53EF\u4EE5\u4ECE `@NgModule` \u548C `@Component` \u516C\u5171 API \u4E2D\u5220\u9664\u4EFB\u4F55\u5BF9\u5B83\u7684\u5F15\u7528\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 ngTemplateOutletContext",action:"ngTemplateOutletContext \u5177\u6709\u66F4\u4E25\u683C\u7684\u7C7B\u578B\u68C0\u67E5\uFF0C\u9700\u8981\u4F60\u5728\u76F8\u5E94\u5BF9\u8C61\u4E2D\u58F0\u660E\u6240\u6709\u5C5E\u6027\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-1)."},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 APF",action:"Angular \u5305\u4E0D\u518D\u5305\u62EC FESM2015\uFF0C\u5E76\u4E14\u5206\u5E03\u5F0F ECMScript \u5DF2\u4ECE 2020 \u66F4\u65B0\u5230 2022\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Advanced,step:"v16 EventManager",action:"\u5DF2\u5220\u9664\u5DF2\u5F03\u7528\u7684 `EventManager` \u65B9\u6CD5 `addGlobalEventListener`\uFF0C\u56E0\u4E3A\u5B83\u672A\u88AB Ivy \u4F7F\u7528\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 BrowserTransferStateModule",action:"`BrowserTransferStateModule` \u4E0D\u518D\u53EF\u7528\uFF0C\u5E76\u4E14\u53EF\u4EE5\u4ECE\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u4E2D\u5220\u9664\u4EFB\u4F55\u5BF9\u5B83\u7684\u5F15\u7528\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Medium,step:"v16 ReflectiveInjector",action:"\u66F4\u65B0\u4F60\u7684\u4EE3\u7801\uFF0C\u4F7F\u7528 `Injector.create` \u800C\u4E0D\u662F `ReflectiveInjector`\uFF0C\u56E0\u4E3A `ReflectiveInjector` \u5DF2\u88AB\u79FB\u9664\u3002"},{possibleIn:1600,necessaryAsOf:1600,level:e.Basic,step:"v16 QueryList",action:"`QueryList.filter` \u73B0\u5728\u652F\u6301\u7C7B\u578B\u4FDD\u62A4\u51FD\u6570\u3002\u7531\u4E8E\u7C7B\u578B\u5C06\u88AB\u7F29\u5C0F\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u4F9D\u8D56\u4E8E\u65E7\u884C\u4E3A\u7684\u5E94\u7528\u7A0B\u5E8F\u4EE3\u7801\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 node support",action:"\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\uFF0C\u8BF7\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528\u53D7\u652F\u6301\u7684 node.js \u7248\u672C\u3002Angular v17 \u652F\u6301 node.js \u7248\u672C\uFF1Av18.13.0 \u53CA\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 ts support",action:"\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\uFF0C\u8BF7\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528\u53D7\u652F\u6301\u7684 TypeScript \u7248\u672C\u3002Angular v17 \u652F\u6301 TypeScript \u7248\u672C 5.2 \u6216\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 zone.js support",action:"\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\uFF0C\u8BF7\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528\u53D7\u652F\u6301\u7684 Zone.js \u7248\u672C\u3002Angular v17 \u652F\u6301 Zone.js \u7248\u672C 0.14.x \u6216\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 ng update",action:"\u5728\u5E94\u7528\u7A0B\u5E8F\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\u8FD0\u884C `ng update @angular/core@17 @angular/cli@17`\uFF0C\u5C06\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u5347\u7EA7\u5230 Angular v17\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@17`\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Medium,step:"v17 style removal",action:"Angular \u73B0\u5728\u4F1A\u81EA\u52A8\u5220\u9664\u9500\u6BC1\u7EC4\u4EF6\u7684\u6837\u5F0F\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5F71\u54CD\u5230\u4F60\u73B0\u6709\u7684\u5E94\u7528\u7A0B\u5E8F\uFF0C\u7279\u522B\u662F\u5728\u4F60\u4F9D\u8D56\u4E8E\u6CC4\u6F0F\u6837\u5F0F\u7684\u60C5\u51B5\u4E0B\u3002\u8981\u66F4\u6539\u6B64\u8BBE\u7F6E\uFF0C\u8BF7\u5C06 `REMOVE_STYLES_ON_COMPONENT_DESTROY` \u63D0\u4F9B\u7A0B\u5E8F\u7684\u503C\u66F4\u6539\u4E3A `false`\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 router removals",action:"\u786E\u4FDD\u4F60\u5728 `provideRouter` \u6216 `RouterModule.forRoot` \u4E2D\u914D\u7F6E `setupTestingRouter`\u3001`canceledNavigationResolution`\u3001`paramsInheritanceStrategy`\u3001`titleStrategy`\u3001`urlUpdateStrategy`\u3001`urlHandlingStrategy` \u548C `malformedUriErrorHandler`\uFF0C\u56E0\u4E3A\u8FD9\u4E9B\u5C5E\u6027\u73B0\u5728\u4E0D\u518D\u662F `Router` \u7684\u516C\u5171 API \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Advanced,step:"v17 ngDoCheck dynamic components",action:"\u5BF9\u4E8E\u52A8\u6001\u5B9E\u4F8B\u5316\u7684\u7EC4\u4EF6\uFF0C\u6211\u4EEC\u73B0\u5728\u5728\u53D8\u66F4\u68C0\u6D4B\u671F\u95F4\u6267\u884C `ngDoCheck`\uFF0C\u5982\u679C\u7EC4\u4EF6\u88AB\u6807\u8BB0\u4E3A\u810F\uFF0C\u5219\u53EF\u80FD\u9700\u8981\u66F4\u65B0\u52A8\u6001\u5B9E\u4F8B\u5316\u7EC4\u4EF6\u7684\u6D4B\u8BD5\u6216 `ngDoCheck` \u4E2D\u7684\u903B\u8F91\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Medium,step:"v17 malformedUriErrorHandler",action:"\u5728 `UrlSerializer.parse` \u4E2D\u5904\u7406 URL \u89E3\u6790\u9519\u8BEF\uFF0C\u800C\u4E0D\u662F `malformedUriErrorHandler`\uFF0C\u56E0\u4E3A\u5B83\u73B0\u5728\u662F\u516C\u5171 API \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Medium,step:"v17 zone deep imports",action:"\u5C06 Zone.js \u7684\u6DF1\u5EA6\u5BFC\u5165\uFF08\u5982 `zone.js/bundles/zone-testing.js` \u548C `zone.js/dist/zone`\uFF09\u66F4\u6539\u4E3A `zone.js` \u548C `zone.js/testing`\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Advanced,step:"v17 absolute redirects",action:"\u4F60\u53EF\u80FD\u9700\u8981\u8C03\u6574\u8DEF\u7531\u5668\u914D\u7F6E\u4EE5\u9632\u6B62\u7EDD\u5BF9\u91CD\u5B9A\u5411\u540E\u7684\u65E0\u9650\u91CD\u5B9A\u5411\u3002\u5728 v17 \u4E2D\uFF0C\u6211\u4EEC\u4E0D\u518D\u5728\u7EDD\u5BF9\u91CD\u5B9A\u5411\u540E\u963B\u6B62\u989D\u5916\u7684\u91CD\u5B9A\u5411\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Medium,step:"v17 AnimationDriver",action:"\u5C06\u5BF9 `AnimationDriver.NOOP` \u7684\u5F15\u7528\u66F4\u6539\u4E3A\u4F7F\u7528 `NoopAnimationDriver`\uFF0C\u56E0\u4E3A `AnimationDriver.NOOP` \u73B0\u5728\u5DF2\u88AB\u5F03\u7528\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 switch strictness",action:"\u4F60\u53EF\u80FD\u9700\u8981\u8C03\u6574 `NgSwitch` \u7684\u76F8\u7B49\u6027\u68C0\u67E5\uFF0C\u56E0\u4E3A\u73B0\u5728\u9ED8\u8BA4\u91C7\u7528\u66F4\u4E25\u683C\u7684 `===` \u800C\u4E0D\u662F `==`\u3002Angular \u5C06\u4E3A\u9700\u8981\u63D0\u4F9B\u8C03\u6574\u7684\u7528\u6CD5\u8BB0\u5F55\u8B66\u544A\u6D88\u606F\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Advanced,step:"v17 mutate in signals",action:"\u5728 Angular \u4FE1\u53F7\u4E2D\u4F7F\u7528 `update` \u4EE3\u66FF `mutate`\u3002\u4F8B\u5982\uFF0C`items.mutate(itemsArray => itemsArray.push(newItem));` \u73B0\u5728\u662F `items.update(itemsArray => [itemsArray, \u2026newItem]);`"},{possibleIn:1700,necessaryAsOf:1700,level:e.Medium,step:"v17 withNoDomReuse",action:"\u8981\u7981\u7528\u6C34\u5408\u4F5C\u7528\uFF0C\u8BF7\u4F7F\u7528 `ngSkipHydration` \u6216\u4ECE\u63D0\u4F9B\u7A0B\u5E8F\u5217\u8868\u4E2D\u5220\u9664 `provideClientHydration` \u8C03\u7528\uFF0C\u56E0\u4E3A `withNoDomReuse` \u4E0D\u518D\u662F\u516C\u5171 API \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1700,necessaryAsOf:1700,level:e.Basic,step:"v17 paramsInheritanceStrategy",action:"\u5982\u679C\u4F60\u5E0C\u671B `loadComponent` \u8DEF\u7531\u7684\u5B50\u8DEF\u7531\u4ECE\u5176\u7236\u8DEF\u7531\u7EE7\u627F\u6570\u636E\uFF0C\u8BF7\u5C06 `paramsInheritanceStrategy` \u6307\u5B9A\u4E3A `always`\uFF0C\u5728 v17 \u4E2D\uFF0C\u73B0\u5728\u8BBE\u7F6E\u4E3A `emptyOnly`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Basic,step:"v18 node support",action:"\u5728\u5347\u7EA7\u5E94\u7528\u7A0B\u5E8F\u4E4B\u524D\uFF0C\u8BF7\u786E\u4FDD\u4F60\u6B63\u5728\u4F7F\u7528\u53D7\u652F\u6301\u7684 node.js \u7248\u672C\u3002Angular v18 \u652F\u6301 node.js \u7248\u672C\uFF1Av18.19.0 \u53CA\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Basic,step:"v18 ng update",action:"\u5728\u5E94\u7528\u7A0B\u5E8F\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\u8FD0\u884C `ng update @angular/core@18 @angular/cli@18`\uFF0C\u5C06\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u5347\u7EA7\u5230 Angular v18\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@18`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Basic,step:"18.0.0 Upgrade TypeScript",action:"\u5C06 TypeScript \u66F4\u65B0\u5230 5.4 \u7248\u672C\u6216\u66F4\u9AD8\u7248\u672C\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: async has been removed, use `waitForAsync` instead",action:"\u4ECE `@angular/core` \u4E2D\u66FF\u6362 `async` \u4E3A `waitForAsync`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: Deprecated matchesElement method removed from AnimationDriver",action:"\u5220\u9664\u5BF9 `matchesElement` \u7684\u8C03\u7528\uFF0C\u56E0\u4E3A\u5B83\u73B0\u5728\u4E0D\u518D\u662F `AnimationDriver` \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0. Use `@angular/core` StateKey and TransferState",action:"\u4ECE `@angular/core` \u4E2D\u5BFC\u5165 `StateKey` \u548C `TransferState`\uFF0C\u800C\u4E0D\u662F `@angular/platform-browser`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0. Opt-in of caching for HTTP requests with auth headers",action:"\u5728 `withHttpTransferCache` \u4E2D\u4F7F\u7528 `includeRequestsWithAuthHeaders: true` \u4EE5\u9009\u62E9\u4E0D\u7F13\u5B58\u9700\u8981\u6388\u6743\u7684 HTTP \u8BF7\u6C42\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0.REMOVE_OBSOLETE_IS_WORKER",action:"\u66F4\u65B0\u5E94\u7528\u7A0B\u5E8F\u4EE5\u5220\u9664 `isPlatformWorkerUi` \u548C `isPlatformWorkerApp`\uFF0C\u56E0\u4E3A\u5B83\u4EEC\u662F\u5E73\u53F0 WebWorker \u7684\u4E00\u90E8\u5206\uFF0C\u800C\u73B0\u5728\u4E0D\u518D\u662F Angular \u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0.FORCE_ZONE_CHANGE_DETECTION",action:"\u6D4B\u8BD5\u53EF\u80FD\u9700\u8981\u8FD0\u884C\u989D\u5916\u7684\u53D8\u66F4\u68C0\u6D4B\u8F6E\u6B21\uFF0C\u4EE5\u5B8C\u5168\u53CD\u6620 DOM \u4E2D\u7684\u6D4B\u8BD5\u72B6\u6001\u3002\u4F5C\u4E3A\u6700\u540E\u7684\u624B\u6BB5\uFF0C\u901A\u8FC7\u5C06 `provideZoneChangeDetection({ignoreChangesOutsideZone: true})` \u6DFB\u52A0\u5230 TestBed \u7684\u63D0\u4F9B\u7A0B\u5E8F\u4E2D\uFF0C\u6062\u590D\u65E7\u7684\u884C\u4E3A\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0: Remove two-way binding expressions in writable bindings",action:"\u5220\u9664\u5728\u4F7F\u7528 `[(ngModel)]` \u7684\u6A21\u677F\u4E2D\u5199\u5165\u5C5E\u6027\u7684\u8868\u8FBE\u5F0F\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: Use zones to track pending requests",action:"\u5220\u9664\u5BF9 `Testability` \u65B9\u6CD5 `increasePendingRequestCount`\u3001`decreasePendingRequestCount` \u548C `getPendingRequestCount` \u7684\u8C03\u7528\u3002\u8FD9\u4E9B\u4FE1\u606F\u7531 ZoneJS \u8DDF\u8E2A\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0: Move shared providers to the routed component",action:"\u5C06\u5E94\u8BE5\u5BF9\u8DEF\u7531\u7EC4\u4EF6\u53EF\u7528\u7684\u4EFB\u4F55\u73AF\u5883\u63D0\u4F9B\u8005\u4ECE\u5B9A\u4E49 `RouterOutlet` \u7684\u7EC4\u4EF6\u79FB\u52A8\u5230 `bootstrapApplication` \u6216 `Route` \u914D\u7F6E\u7684\u63D0\u4F9B\u8005\u4E2D\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0 Use RedirectCommand or new NavigationBehaviorOptions",action:"\u5F53\u5B88\u536B\u5C06 `UrlTree` \u4F5C\u4E3A\u91CD\u5B9A\u5411\u8FD4\u56DE\u65F6\uFF0C\u91CD\u5B9A\u5411\u5BFC\u822A\u73B0\u5728\u5C06\u4F7F\u7528 `replaceUrl`\uFF0C\u5982\u679C\u521D\u59CB\u5BFC\u822A\u4E5F\u4F7F\u7528\u4E86 `replaceUrl` \u9009\u9879\u3002\u5982\u679C\u4F60\u5E0C\u671B\u4FDD\u7559\u4EE5\u524D\u7684\u884C\u4E3A\uFF0C\u8BF7\u4F7F\u7528\u65B0\u7684 `NavigationBehaviorOptions` \u914D\u7F6E\u91CD\u5B9A\u5411\uFF0C\u65B9\u6CD5\u662F\u8FD4\u56DE\u5177\u6709\u6240\u9700\u9009\u9879\u7684 `RedirectCommand` \u800C\u4E0D\u662F `UrlTree`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: Remove deprecated resource cache providers",action:"\u5220\u9664 `RESOURCE_CACHE_PROVIDER` \u7684\u4F9D\u8D56\u9879\uFF0C\u56E0\u4E3A\u5B83\u4E0D\u518D\u662F Angular \u8FD0\u884C\u65F6\u7684\u4E00\u90E8\u5206\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: Update Node.js URL parsing in `ServerPlatformLocation`",action:"\u5728 `@angular/platform-server` \u4E2D\uFF0C\u73B0\u5728 `pathname` \u603B\u662F\u4EE5 `/` \u7ED3\u5C3E\uFF0C\u800C http: \u548C https: \u7684\u9ED8\u8BA4\u7AEF\u53E3\u5206\u522B\u662F 80 \u548C 443\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0. Use absolute URLs",action:"\u63D0\u4F9B\u7EDD\u5BF9 `url`\uFF0C\u800C\u4E0D\u662F\u4F7F\u7528 `PlatformConfig` \u4E2D\u7684 `useAbsoluteUrl` \u548C `baseUrl`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0. Switch from `platformDynamicServer` to `platformServer`.",action:"\u5C06 `platformDynamicServer` \u7684\u7528\u6CD5\u66FF\u6362\u4E3A `platformServer`\u3002\u53E6\u5916\uFF0C\u6DFB\u52A0\u4E00\u4E2A `import @angular/compiler`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0. Remove `ServerTransferStateModule` from app imports",action:"\u4ECE\u5E94\u7528\u7A0B\u5E8F\u4E2D\u5220\u9664\u6240\u6709\u5BF9 `ServerTransferStateModule` \u7684\u5BFC\u5165\u3002\u5B83\u4E0D\u518D\u9700\u8981\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0. Update `Route.redirectTo` to accept functions",action:"`Route.redirectTo` \u73B0\u5728\u53EF\u4EE5\u63A5\u53D7\u51FD\u6570\uFF0C\u800C\u4E0D\u4EC5\u4EC5\u662F\u5B57\u7B26\u4E32\u3002\u4EFB\u4F55\u76F4\u63A5\u8BFB\u53D6 `Route` \u5BF9\u8C61\u5E76\u671F\u671B `redirectTo` \u662F\u5B57\u7B26\u4E32\u7684\u4EE3\u7801\u53EF\u80FD\u9700\u8981\u66F4\u65B0\uFF0C\u4EE5\u8003\u8651\u51FD\u6570\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: Guards can return `RedirectCommand`",action:"\u9664\u4E86 `UrlTree` \u548C `boolean`\uFF0C`Route` \u5B88\u536B\u548C\u89E3\u6790\u5668\u73B0\u5728\u8FD8\u53EF\u4EE5\u8FD4\u56DE\u4E00\u4E2A `RedirectCommand` \u5BF9\u8C61\u3002\u4EFB\u4F55\u76F4\u63A5\u8BFB\u53D6 `Route` \u5BF9\u8C61\u5E76\u671F\u671B\u53EA\u6709 `boolean` \u6216 `UrlTree` \u7684\u4EE3\u7801\u53EF\u80FD\u9700\u8981\u66F4\u65B0\uFF0C\u4EE5\u8003\u8651 `RedirectCommand`\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Medium,step:"18.0.0: Mark `OnPush` views dirty",action:"\u5BF9\u4E8E\u4F7F\u7528 `OnPush` \u53D8\u66F4\u68C0\u6D4B\u7684\u4EFB\u4F55\u7EC4\u4EF6\uFF0C\u8BF7\u786E\u4FDD\u5B83\u4EEC\u88AB\u6B63\u786E\u6807\u8BB0\u4E3A\u810F\uFF0C\u4EE5\u542F\u7528\u5BBF\u4E3B\u7ED1\u5B9A\u66F4\u65B0\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0-Refresh-Newly-Created-Views",action:"\u8BF7\u6CE8\u610F\uFF0C\u65B0\u521B\u5EFA\u7684\u89C6\u56FE\u6216\u5728\u53D8\u66F4\u68C0\u6D4B\u671F\u95F4\u6807\u8BB0\u4E3A\u68C0\u67E5\u5E76\u91CD\u65B0\u9644\u52A0\u7684\u89C6\u56FE\u73B0\u5728\u4FDD\u8BC1\u5728\u540C\u4E00\u53D8\u66F4\u68C0\u6D4B\u5468\u671F\u4E2D\u5237\u65B0\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0: `ComponentFixture.whenStable` matches `ApplicationRef.isStable`",action:"\u5728\u8C03\u6574 `ComponentFixture.whenStable` \u548C `ApplicationRef.isStable` \u8BED\u4E49\u540E\uFF0C\u4F7F\u7528 `whenStable` \u65F6\u4F60\u7684\u6D4B\u8BD5\u53EF\u80FD\u9700\u8981\u66F4\u957F\u65F6\u95F4\u7B49\u5F85\u3002"},{possibleIn:1800,necessaryAsOf:1800,level:e.Advanced,step:"18.0.0. `ComponentFixture.autoDetect` behavior more closely matches Application behavior",action:"\u5982\u679C\u4F60\u7684\u6D4B\u8BD5\u4F9D\u8D56\u4E8E `ComponentFixture.autoDetect` \u7684\u53D8\u66F4\u68C0\u6D4B\u6267\u884C\u987A\u5E8F\uFF0C\u53EF\u80FD\u4F1A\u9047\u5230\u6D4B\u8BD5\u5931\u8D25\uFF0C\u56E0\u4E3A\u5B83\u73B0\u5728\u4F1A\u5728 `ApplicationRef.tick` \u4E2D\u6267\u884C\u6D4B\u8BD5\u5939\u5177\u7684\u53D8\u66F4\u68C0\u6D4B\u3002\u4F8B\u5982\uFF0C\u8FD9\u5C06\u5BFC\u81F4\u6D4B\u8BD5\u5939\u5177\u5728\u521B\u5EFA\u4EFB\u4F55\u5BF9\u8BDD\u6846\u4E4B\u524D\u5237\u65B0\uFF0C\u800C\u4EE5\u524D\u53EF\u80FD\u76F8\u53CD\u3002"},{action:"\u5728\u5E94\u7528\u7A0B\u5E8F\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\uFF0C\u8FD0\u884C `ng update @angular/core@19 @angular/cli@19` \u4EE5\u5C06\u5E94\u7528\u5347\u7EA7\u5230Angular v19\u3002",level:e.Basic,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0_ng_update"},{possibleIn:1900,necessaryAsOf:1900,level:e.Basic,material:true,step:"update @angular/material",action:"\u8FD0\u884C `ng update @angular/material@19`\u3002"},{action:"Angular\u6307\u4EE4\u3001\u7EC4\u4EF6\u548C\u7BA1\u9053\u73B0\u5728\u9ED8\u8BA4\u662F\u72EC\u7ACB\u7684\u3002\u5BF9\u4E8E\u5F53\u524D\u5728NgModule\u4E2D\u58F0\u660E\u7684\u58F0\u660E\uFF0C\u9700\u660E\u786E\u6307\u5B9A `standalone: false`\u3002Angular CLI\u5C06\u81EA\u52A8\u66F4\u65B0\u4EE3\u7801\u4EE5\u53CD\u6620\u6B64\u53D8\u66F4\u3002",level:e.Basic,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-standalone-declarations"},{action:"\u8BBF\u95EE\u6A21\u677F\u5F15\u7528\u53D8\u91CF\u65F6\u79FB\u9664 `this.` \u524D\u7F00\u3002\u4F8B\u5982\uFF0C\u5C06 `<div #foo></div>{{ this.foo }}` \u91CD\u6784\u4E3A `<div #foo></div>{{ foo }}`",level:e.Medium,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-remove-this"},{action:"\u5C06 `BrowserModule.withServerTransition()` \u7684\u7528\u6CD5\u66FF\u6362\u4E3A\u6CE8\u5165 `APP_ID` \u4EE4\u724C\u6765\u8BBE\u7F6E\u5E94\u7528 `id`\u3002",level:e.Basic,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-remove-browser-module-with-server-transition"},{action:"`KeyValueDiffers` \u4E2D\u7684 `factories` \u5C5E\u6027\u5DF2\u88AB\u79FB\u9664\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-remove-key-value-differs-factories"},{action:"\u5728angular.json\u4E2D\uFF0C\u5C06 `@angular/localize` \u6784\u5EFA\u5668\u7684 `name` \u9009\u9879\u66FF\u6362\u4E3A `project`\u3002",level:e.Medium,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0_localize_builder_project_option"},{action:"\u5C06 `ExperimentalPendingTasks` \u91CD\u547D\u540D\u4E3A `PendingTasks`\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0_rename_experimental_pending_tasks"},{action:"\u66F4\u65B0\u4F9D\u8D56effects\u7684 `Promise` \u65F6\u5E8F\u7684\u6D4B\u8BD5\uFF0C\u6539\u7528 `await whenStable()` \u6216\u8C03\u7528 `.detectChanges()` \u6765\u89E6\u53D1effects\u3002\u5BF9\u4E8E\u5728\u53D8\u66F4\u68C0\u6D4B\u671F\u95F4\u89E6\u53D1\u7684effects\uFF0C\u786E\u4FDD\u5B83\u4EEC\u4E0D\u4F9D\u8D56\u5E94\u7528\u5B8C\u5168\u6E32\u67D3\uFF0C\u6216\u8003\u8651\u4F7F\u7528 `afterRenderEffect()`\u3002\u4F7F\u7528\u6A21\u62DF\u65F6\u949F\u7684\u6D4B\u8BD5\u53EF\u80FD\u9700\u8981\u5FEB\u8FDB/\u6E05\u7A7A\u65F6\u949F\u3002",level:e.Medium,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0.1"},{action:"\u5347\u7EA7\u81F3TypeScript 5.5\u6216\u66F4\u9AD8\u7248\u672C\u3002",level:e.Basic,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0.2"},{action:"\u66F4\u65B0\u4F7F\u7528 `fakeAsync` \u7684\u6D4B\u8BD5\uFF1A\u5F53\u53D8\u66F4\u53D1\u751F\u5728 Angular Zone \u5916\u90E8\u65F6\uFF08\u6DF7\u5408\u6A21\u5F0F\u8C03\u5EA6\uFF09\uFF0C\u539F\u6D4B\u8BD5\u4F9D\u8D56\u7684 Zone \u5408\u5E76\u548C\u8C03\u5EA6\u7684\u7279\u5B9A\u65F6\u5E8F\u53EF\u80FD\u53D7\u5230\u5F71\u54CD\uFF0C\u56E0\u4E3A\u73B0\u5728\u8FD9\u4E9B\u8BA1\u65F6\u5668\u4F1A\u53D7 `tick` \u548C `flush` \u5F71\u54CD\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-timers-in-zone"},{action:"\u4F7F\u7528 `createComponent` API\u4E14\u672A\u4F20\u9012\u7B2C\u4E00\u4E2A `ng-content` \u7684\u5185\u5BB9\u65F6\uFF0C\u9700\u63D0\u4F9B `document.createTextNode('')` \u4F5C\u4E3A `projectableNode` \u4EE5\u9632\u6B62\u6E32\u67D3\u9ED8\u8BA4\u56DE\u9000\u5185\u5BB9\u3002",level:e.Medium,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-render-default-fallback"},{action:"\u66F4\u65B0\u4F9D\u8D56\u81EA\u5B9A\u4E49\u5143\u7D20\u5468\u8FB9\u53D8\u66F4\u68C0\u6D4B\u7279\u5B9A\u65F6\u5E8F\u6216\u987A\u5E8F\u7684\u6D4B\u8BD5\uFF0C\u7531\u4E8E\u5207\u6362\u81F3\u6DF7\u5408\u8C03\u5EA6\u5668\uFF0C\u65F6\u5E8F\u53EF\u80FD\u5DF2\u53D1\u751F\u53D8\u5316\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-hybrid-scheduler-timing"},{action:"\u4ECE\u4F7F\u7528 `Router.errorHandler` \u8FC1\u79FB\u5230 `provideRouter` \u7684 `withNavigationErrorHandler` \u6216 `RouterModule.forRoot` \u7684 `errorHandler`\u3002",level:e.Basic,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-router-error-handler"},{action:"\u66F4\u65B0\u6D4B\u8BD5\u4EE5\u5904\u7406 `ApplicationRef.tick` \u671F\u95F4\u629B\u51FA\u7684\u9519\u8BEF\uFF1A\u53EF\u901A\u8FC7\u540C\u6B65\u89E6\u53D1\u53D8\u66F4\u68C0\u6D4B\u6216\u62D2\u7EDD\u672A\u5B8C\u6210\u7684 `ComponentFixture.whenStable` Promise\u6765\u5B9E\u73B0\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-testbed-error-handling"},{action:"\u66F4\u65B0 `Resolve` \u63A5\u53E3\u7684\u7528\u6CD5\uFF0C\u5728\u5176\u8FD4\u56DE\u7C7B\u578B\u4E2D\u5305\u542B `RedirectCommand`\u3002",level:e.Medium,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-update-resolve-interface-return-type"},{action:"`fakeAsync` \u73B0\u5728\u9ED8\u8BA4\u4F1A\u6E05\u7A7A\u5F85\u5904\u7406\u8BA1\u65F6\u5668\u3002\u82E5\u6D4B\u8BD5\u9700\u8981\u539F\u6709\u884C\u4E3A\uFF0C\u9700\u5728\u9009\u9879\u53C2\u6570\u4E2D\u663E\u5F0F\u4F20\u9012 `{flush: false}`\u3002",level:e.Advanced,necessaryAsOf:1900,possibleIn:1900,step:"19.0.0-update-fakeasync-to-flush-pending-timers"}];var he=class{_document;_textarea;constructor(o,t){this._document=t;let i=this._textarea=this._document.createElement("textarea"),a=i.style;a.position="fixed",a.top=a.opacity="0",a.left="-999em",i.setAttribute("aria-hidden","true"),i.value=o,i.readOnly=true,(this._document.fullscreenElement||this._document.body).appendChild(i);}copy(){let o=this._textarea,t=false;try{if(o){let i=this._document.activeElement;o.select(),o.setSelectionRange(0,o.value.length),t=this._document.execCommand("copy"),i&&i.focus();}}catch{}return t}destroy(){let o=this._textarea;o&&(o.remove(),this._textarea=void 0);}},Ve=(()=>{class n{_document=D(I);constructor(){}copy(t){let i=this.beginCopy(t),a=i.copy();return i.destroy(),a}beginCopy(t){return new he(t,this._document)}static \u0275fac=function(i){return new(i||n)};static \u0275prov=V({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();var at=["*"],je=(()=>{class n{labelPosition;static \u0275fac=function(i){return new(i||n)};static \u0275cmp=Db({type:n,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,a){i&2&&zh("mdc-form-field--align-end",a.labelPosition==="before");},inputs:{labelPosition:"labelPosition"},ngContentSelectors:at,decls:1,vars:0,template:function(i,a){i&1&&(zD(),ZD(0));},styles:[".mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}"],encapsulation:2,changeDetection:0})}return n})();var it=["input"],nt=["label"],ot=["*"],rt=new S("mat-checkbox-default-options",{providedIn:"root",factory:Ue});function Ue(){return {color:"accent",clickAction:"check-indeterminate",disabledInteractive:false}}var y=function(n){return n[n.Init=0]="Init",n[n.Checked=1]="Checked",n[n.Unchecked=2]="Unchecked",n[n.Indeterminate=3]="Indeterminate",n}(y||{}),be=class{source;checked},Ge=Ue(),fe=(()=>{class n{_elementRef=D(Rr);_changeDetectorRef=D(r1);_ngZone=D(oe$1);_animationsDisabled=li();_options=D(rt,{optional:true});focus(){this._inputElement.nativeElement.focus();}_createChangeEvent(t){let i=new be;return i.source=this,i.checked=t,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return `${this.id||this._uniqueId}-input`}required;labelPosition="after";name=null;change=new nt$2;indeterminateChange=new nt$2;value;disableRipple;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=y.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){D(z).load(Br);let t=D(new Mg("tabindex"),{optional:true});this._options=this._options||Ge,this.color=this._options.color||Ge.color,this.tabIndex=t==null?0:parseInt(t)||0,this.id=this._uniqueId=D(Ke$1).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??false;}ngOnChanges(t){t.required&&this._validatorChangeFn();}ngAfterViewInit(){this._syncIndeterminate(this._indeterminate);}get checked(){return this._checked}set checked(t){t!=this.checked&&(this._checked=t,this._changeDetectorRef.markForCheck());}_checked=false;get disabled(){return this._disabled}set disabled(t){t!==this.disabled&&(this._disabled=t,this._changeDetectorRef.markForCheck());}_disabled=false;get indeterminate(){return this._indeterminate}set indeterminate(t){let i=t!=this._indeterminate;this._indeterminate=t,i&&(this._indeterminate?this._transitionCheckState(y.Indeterminate):this._transitionCheckState(this.checked?y.Checked:y.Unchecked),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate);}_indeterminate=false;_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges();}writeValue(t){this.checked=!!t;}registerOnChange(t){this._controlValueAccessorChangeFn=t;}registerOnTouched(t){this._onTouched=t;}setDisabledState(t){this.disabled=t;}validate(t){return this.required&&t.value!==true?{required:true}:null}registerOnValidatorChange(t){this._validatorChangeFn=t;}_transitionCheckState(t){let i=this._currentCheckState,a=this._getAnimationTargetElement();if(!(i===t||!a)&&(this._currentAnimationClass&&a.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,t),this._currentCheckState=t,this._currentAnimationClass.length>0)){a.classList.add(this._currentAnimationClass);let r=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{a.classList.remove(r);},1e3);});}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked);}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked);}_handleInputClick(){let t=this._options?.clickAction;!this.disabled&&t!=="noop"?(this.indeterminate&&t!=="check"&&Promise.resolve().then(()=>{this._indeterminate=false,this.indeterminateChange.emit(this._indeterminate);}),this._checked=!this._checked,this._transitionCheckState(this._checked?y.Checked:y.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&t==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate);}_onInteractionEvent(t){t.stopPropagation();}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck();});}_getAnimationClassForCheckStateTransition(t,i){if(this._animationsDisabled)return "";switch(t){case y.Init:if(i===y.Checked)return this._animationClasses.uncheckedToChecked;if(i==y.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case y.Unchecked:return i===y.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case y.Checked:return i===y.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case y.Indeterminate:return i===y.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return ""}_syncIndeterminate(t){let i=this._inputElement;i&&(i.nativeElement.indeterminate=t);}_onInputClick(){this._handleInputClick();}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus();}_preventBubblingFromLabel(t){t.target&&this._labelElement.nativeElement.contains(t.target)&&t.stopPropagation();}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=Db({type:n,selectors:[["mat-checkbox"]],viewQuery:function(i,a){if(i&1&&(JD(it,5),JD(nt,5)),i&2){let r;KD(r=XD())&&(a._inputElement=r.first),KD(r=XD())&&(a._labelElement=r.first);}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,a){i&2&&(sg("id",a.id),$h("tabindex",null)("aria-label",null)("aria-labelledby",null),ED(a.color?"mat-"+a.color:"mat-accent"),zh("_mat-animation-noopable",a._animationsDisabled)("mdc-checkbox--disabled",a.disabled)("mat-mdc-checkbox-disabled",a.disabled)("mat-mdc-checkbox-checked",a.checked)("mat-mdc-checkbox-disabled-interactive",a.disabledInteractive));},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",i1],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",i1],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",i1],tabIndex:[2,"tabIndex","tabIndex",t=>t==null?void 0:a1(t)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",i1],checked:[2,"checked","checked",i1],disabled:[2,"disabled","disabled",i1],indeterminate:[2,"indeterminate","indeterminate",i1]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[pw([{provide:Qt,useExisting:No(()=>n),multi:true},{provide:Ca,useExisting:n,multi:true}]),xy],ngContentSelectors:ot,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],[1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],[1,"mdc-checkbox__ripple"],[1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24","aria-hidden","true",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,a){if(i&1){let r=UD();zD(),gl(0,"div",3),ag("click",function(h){return Xu(r),ed(a._preventBubblingFromLabel(h))}),gl(1,"div",4,0)(3,"div",5),ag("click",function(){return Xu(r),ed(a._onTouchTargetClick())}),ml(),gl(4,"input",6,1),ag("blur",function(){return Xu(r),ed(a._onBlur())})("click",function(){return Xu(r),ed(a._onInputClick())})("change",function(h){return Xu(r),ed(a._onInteractionEvent(h))}),ml(),Xh(6,"div",7),gl(7,"div",8),dd(),gl(8,"svg",9),Xh(9,"path",10),ml(),fd(),Xh(10,"div",11),ml(),Xh(11,"div",12),ml(),gl(12,"label",13,2),ZD(14),ml()();}if(i&2){let r=rw(2);Wh("labelPosition",a.labelPosition),SI(4),zh("mdc-checkbox--selected",a.checked),Wh("checked",a.checked)("indeterminate",a.indeterminate)("disabled",a.disabled&&!a.disabledInteractive)("id",a.inputId)("required",a.required)("tabIndex",a.disabled&&!a.disabledInteractive?-1:a.tabIndex),$h("aria-label",a.ariaLabel||null)("aria-labelledby",a.ariaLabelledby)("aria-describedby",a.ariaDescribedby)("aria-checked",a.indeterminate?"mixed":null)("aria-controls",a.ariaControls)("aria-disabled",a.disabled&&a.disabledInteractive?true:null)("aria-expanded",a.ariaExpanded)("aria-owns",a.ariaOwns)("name",a.name)("value",a.value),SI(7),Wh("matRippleTrigger",r)("matRippleDisabled",a.disableRipple||a.disabled)("matRippleCentered",true),SI(),Wh("for",a.inputId);}},dependencies:[Fr,je],styles:['.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mdc-checkbox-state-layer-size, 40px);height:var(--mdc-checkbox-state-layer-size, 40px);top:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);right:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}@media(forced-colors: active){.mdc-checkbox--disabled{opacity:.5}}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mdc-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:48px;width:48px;transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus~.mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return n})(),$e=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[fe,st$1,st$1]})}return n})();var qe=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({})}return n})();var ve=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[st$1,xn,st$1]})}return n})();var We=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[st$1,ve,ve,qe,st$1]})}return n})();var Ke=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[st$1,st$1]})}return n})();var _e=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[st$1,st$1]})}return n})();var Ze=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[_e,st$1,_e,st$1]})}return n})();var Q=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new pe;constructor(o=false,t,i=true,a){this._multiple=o,this._emitChanges=i,this.compareWith=a,t&&t.length&&(o?t.forEach(r=>this._markSelected(r)):this._markSelected(t[0]),this._selectedToEmit.length=0);}select(...o){this._verifyValueAssignment(o),o.forEach(i=>this._markSelected(i));let t=this._hasQueuedChanges();return this._emitChangeEvent(),t}deselect(...o){this._verifyValueAssignment(o),o.forEach(i=>this._unmarkSelected(i));let t=this._hasQueuedChanges();return this._emitChangeEvent(),t}setSelection(...o){this._verifyValueAssignment(o);let t=this.selected,i=new Set(o.map(r=>this._getConcreteValue(r)));o.forEach(r=>this._markSelected(r)),t.filter(r=>!i.has(this._getConcreteValue(r,i))).forEach(r=>this._unmarkSelected(r));let a=this._hasQueuedChanges();return this._emitChangeEvent(),a}toggle(o){return this.isSelected(o)?this.deselect(o):this.select(o)}clear(o=true){this._unmarkAll();let t=this._hasQueuedChanges();return o&&this._emitChangeEvent(),t}isSelected(o){return this._selection.has(this._getConcreteValue(o))}isEmpty(){return this._selection.size===0}hasValue(){return !this.isEmpty()}sort(o){this._multiple&&this.selected&&this._selected.sort(o);}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[]);}_markSelected(o){o=this._getConcreteValue(o),this.isSelected(o)||(this._multiple||this._unmarkAll(),this.isSelected(o)||this._selection.add(o),this._emitChanges&&this._selectedToEmit.push(o));}_unmarkSelected(o){o=this._getConcreteValue(o),this.isSelected(o)&&(this._selection.delete(o),this._emitChanges&&this._deselectedToEmit.push(o));}_unmarkAll(){this.isEmpty()||this._selection.forEach(o=>this._unmarkSelected(o));}_verifyValueAssignment(o){o.length>1&&this._multiple;}_hasQueuedChanges(){return !!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(o,t){if(this.compareWith){t=t??this._selection;for(let i of t)if(this.compareWith(o,i))return i;return o}else return o}};var Qe=(()=>{class n{_animationsDisabled=li();state="unchecked";disabled=false;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=Db({type:n,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,a){i&2&&zh("mat-pseudo-checkbox-indeterminate",a.state==="indeterminate")("mat-pseudo-checkbox-checked",a.state==="checked")("mat-pseudo-checkbox-disabled",a.disabled)("mat-pseudo-checkbox-minimal",a.appearance==="minimal")("mat-pseudo-checkbox-full",a.appearance==="full")("_mat-animation-noopable",a._animationsDisabled);},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,a){},styles:['.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-minimal-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-full-pseudo-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-full-pseudo-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-full-pseudo-checkbox-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-full-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-full-pseudo-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-full-pseudo-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}'],encapsulation:2,changeDetection:0})}return n})();var ct=["button"],lt=["*"];function dt(n,o){if(n&1&&(gl(0,"div",2),Xh(1,"mat-pseudo-checkbox",6),ml()),n&2){let t=WD();SI(),Wh("disabled",t.disabled);}}var Xe=new S("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:mt});function mt(){return {hideSingleSelectionIndicator:false,hideMultipleSelectionIndicator:false,disabledInteractive:false}}var Ye=new S("MatButtonToggleGroup"),ut={provide:Qt,useExisting:No(()=>ye),multi:true},oe=class{source;value;constructor(o,t){this.source=o,this.value=t;}},ye=(()=>{class n{_changeDetector=D(r1);_dir=D(le,{optional:true});_multiple=false;_disabled=false;_disabledInteractive=false;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(t){this._name=t,this._markButtonsForCheck();}_name=D(Ke$1).getId("mat-button-toggle-group-");vertical;get value(){let t=this._selectionModel?this._selectionModel.selected:[];return this.multiple?t.map(i=>i.value):t[0]?t[0].value:void 0}set value(t){this._setSelectionByValue(t),this.valueChange.emit(this.value);}valueChange=new nt$2;get selected(){let t=this._selectionModel?this._selectionModel.selected:[];return this.multiple?t:t[0]||null}get multiple(){return this._multiple}set multiple(t){this._multiple=t,this._markButtonsForCheck();}get disabled(){return this._disabled}set disabled(t){this._disabled=t,this._markButtonsForCheck();}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(t){this._disabledInteractive=t,this._markButtonsForCheck();}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new nt$2;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(t){this._hideSingleSelectionIndicator=t,this._markButtonsForCheck();}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(t){this._hideMultipleSelectionIndicator=t,this._markButtonsForCheck();}_hideMultipleSelectionIndicator;constructor(){let t=D(Xe,{optional:true});this.appearance=t&&t.appearance?t.appearance:"standard",this.hideSingleSelectionIndicator=t?.hideSingleSelectionIndicator??false,this.hideMultipleSelectionIndicator=t?.hideMultipleSelectionIndicator??false;}ngOnInit(){this._selectionModel=new Q(this.multiple,void 0,false);}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(t=>t.checked)),this.multiple||this._initializeTabIndex();}writeValue(t){this.value=t,this._changeDetector.markForCheck();}registerOnChange(t){this._controlValueAccessorChangeFn=t;}registerOnTouched(t){this._onTouched=t;}setDisabledState(t){this.disabled=t;}_keydown(t){if(this.multiple||this.disabled)return;let a=t.target.id,r=this._buttonToggles.toArray().findIndex(h=>h.buttonId===a),l=null;switch(t.keyCode){case 32:case 13:l=this._buttonToggles.get(r)||null;break;case 38:l=this._getNextButton(r,-1);break;case 37:l=this._getNextButton(r,this.dir==="ltr"?-1:1);break;case 40:l=this._getNextButton(r,1);break;case 39:l=this._getNextButton(r,this.dir==="ltr"?1:-1);break;default:return}l&&(t.preventDefault(),l._onButtonClick(),l.focus());}_emitChangeEvent(t){let i=new oe(t,this.value);this._rawValue=i.value,this._controlValueAccessorChangeFn(i.value),this.change.emit(i);}_syncButtonToggle(t,i,a=false,r=false){!this.multiple&&this.selected&&!t.checked&&(this.selected.checked=false),this._selectionModel?i?this._selectionModel.select(t):this._selectionModel.deselect(t):r=true,r?Promise.resolve().then(()=>this._updateModelValue(t,a)):this._updateModelValue(t,a);}_isSelected(t){return this._selectionModel&&this._selectionModel.isSelected(t)}_isPrechecked(t){return typeof this._rawValue>"u"?false:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(i=>t.value!=null&&i===t.value):t.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(t=>{t.tabIndex=-1;}),this.selected)this.selected.tabIndex=0;else for(let t=0;t<this._buttonToggles.length;t++){let i=this._buttonToggles.get(t);if(!i.disabled){i.tabIndex=0;break}}this._markButtonsForCheck();}_getNextButton(t,i){let a=this._buttonToggles;for(let r=1;r<=a.length;r++){let l=(t+i*r+a.length)%a.length,h=a.get(l);if(h&&!h.disabled)return h}return null}_setSelectionByValue(t){if(this._rawValue=t,!this._buttonToggles)return;let i=this._buttonToggles.toArray();if(this.multiple&&t?(this._clearSelection(),t.forEach(a=>this._selectValue(a,i))):(this._clearSelection(),this._selectValue(t,i)),!this.multiple&&i.every(a=>a.tabIndex===-1)){for(let a of i)if(!a.disabled){a.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(t=>{t.checked=false,this.multiple||(t.tabIndex=-1);});}_selectValue(t,i){for(let a of i)if(a.value===t){a.checked=true,this._selectionModel.select(a),this.multiple||(a.tabIndex=0);break}}_updateModelValue(t,i){i&&this._emitChangeEvent(t),this.valueChange.emit(this.value);}_markButtonsForCheck(){this._buttonToggles?.forEach(t=>t._markForCheck());}static \u0275fac=function(i){return new(i||n)};static \u0275dir=Nb({type:n,selectors:[["mat-button-toggle-group"]],contentQueries:function(i,a,r){if(i&1&&YD(r,re,5),i&2){let l;KD(l=XD())&&(a._buttonToggles=l);}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(i,a){i&1&&ag("keydown",function(l){return a._keydown(l)}),i&2&&($h("role",a.multiple?"group":"radiogroup")("aria-disabled",a.disabled),zh("mat-button-toggle-vertical",a.vertical)("mat-button-toggle-group-appearance-standard",a.appearance==="standard"));},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",i1],value:"value",multiple:[2,"multiple","multiple",i1],disabled:[2,"disabled","disabled",i1],disabledInteractive:[2,"disabledInteractive","disabledInteractive",i1],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",i1],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",i1]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[pw([ut,{provide:Ye,useExisting:n}])]})}return n})(),re=(()=>{class n{_changeDetectorRef=D(r1);_elementRef=D(Rr);_focusMonitor=D(Xt);_idGenerator=D(Ke$1);_animationDisabled=li();_checked=false;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return `${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex}set tabIndex(t){t!==this._tabIndex&&(this._tabIndex=t,this._markForCheck());}_tabIndex;disableRipple;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(t){this._appearance=t;}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(t){t!==this._checked&&(this._checked=t,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck());}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(t){this._disabled=t;}_disabled=false;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(t){this._disabledInteractive=t;}_disabledInteractive;change=new nt$2;constructor(){D(z).load(Br);let t=D(Ye,{optional:true}),i=D(new Mg("tabindex"),{optional:true})||"",a=D(Xe,{optional:true});this._tabIndex=parseInt(i)||0,this.buttonToggleGroup=t,this.appearance=a&&a.appearance?a.appearance:"standard",this.disabledInteractive=a?.disabledInteractive??false;}ngOnInit(){let t=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),t&&(t._isPrechecked(this)?this.checked=true:t._isSelected(this)!==this._checked&&t._syncButtonToggle(this,this._checked));}ngAfterViewInit(){this._animationDisabled||this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,true);}ngOnDestroy(){let t=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),t&&t._isSelected(this)&&t._syncButtonToggle(this,false,false,true);}focus(t){this._buttonElement.nativeElement.focus(t);}_onButtonClick(){if(this.disabled)return;let t=this.isSingleSelector()?true:!this._checked;if(t!==this._checked&&(this._checked=t,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,true),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let i=this.buttonToggleGroup._buttonToggles.find(a=>a.tabIndex===0);i&&(i.tabIndex=-1),this.tabIndex=0;}this.change.emit(new oe(this,this.value));}_markForCheck(){this._changeDetectorRef.markForCheck();}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=Db({type:n,selectors:[["mat-button-toggle"]],viewQuery:function(i,a){if(i&1&&JD(ct,5),i&2){let r;KD(r=XD())&&(a._buttonElement=r.first);}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(i,a){i&1&&ag("focus",function(){return a.focus()}),i&2&&($h("aria-label",null)("aria-labelledby",null)("id",a.id)("name",null),zh("mat-button-toggle-standalone",!a.buttonToggleGroup)("mat-button-toggle-checked",a.checked)("mat-button-toggle-disabled",a.disabled)("mat-button-toggle-disabled-interactive",a.disabledInteractive)("mat-button-toggle-appearance-standard",a.appearance==="standard"));},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",i1],appearance:"appearance",checked:[2,"checked","checked",i1],disabled:[2,"disabled","disabled",i1],disabledInteractive:[2,"disabledInteractive","disabledInteractive",i1]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:lt,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(i,a){if(i&1){let r=UD();zD(),gl(0,"button",1,0),ag("click",function(){return Xu(r),ed(a._onButtonClick())}),OD(2,dt,2,1,"div",2),gl(3,"span",3),ZD(4),ml()(),Xh(5,"span",4)(6,"span",5);}if(i&2){let r=rw(1);Wh("id",a.buttonId)("disabled",a.disabled&&!a.disabledInteractive||null),$h("role",a.isSingleSelector()?"radio":"button")("tabindex",a.disabled&&!a.disabledInteractive?-1:a.tabIndex)("aria-pressed",a.isSingleSelector()?null:a.checked)("aria-checked",a.isSingleSelector()?a.checked:null)("name",a._getButtonName())("aria-label",a.ariaLabel)("aria-labelledby",a.ariaLabelledby)("aria-disabled",a.disabled&&a.disabledInteractive?"true":null),SI(2),AD(a.buttonToggleGroup&&(!a.buttonToggleGroup.multiple&&!a.buttonToggleGroup.hideSingleSelectionIndicator||a.buttonToggleGroup.multiple&&!a.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),SI(4),Wh("matRippleTrigger",r)("matRippleDisabled",a.disableRipple||a.disabled);}},dependencies:[Fr,Qe],styles:[".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);transform:translateZ(0);border-radius:var(--mat-legacy-button-toggle-shape)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-legacy-button-toggle-text-color);font-family:var(--mat-legacy-button-toggle-label-text-font);font-size:var(--mat-legacy-button-toggle-label-text-size);line-height:var(--mat-legacy-button-toggle-label-text-line-height);font-weight:var(--mat-legacy-button-toggle-label-text-weight);letter-spacing:var(--mat-legacy-button-toggle-label-text-tracking);--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-legacy-button-toggle-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-legacy-button-toggle-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-legacy-button-toggle-selected-state-text-color);background-color:var(--mat-legacy-button-toggle-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-legacy-button-toggle-disabled-state-text-color);background-color:var(--mat-legacy-button-toggle-disabled-state-background-color);--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-legacy-button-toggle-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-legacy-button-toggle-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-standard-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-standard-button-toggle-background-color, transparent);font-family:var(--mat-standard-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-standard-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-standard-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-standard-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-standard-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-standard-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-standard-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-standard-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-legacy-button-toggle-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-standard-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-legacy-button-toggle-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}"],encapsulation:2,changeDetection:0})}return n})(),Je=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=Tb({type:n});static \u0275inj=xu({imports:[st$1,io,re,st$1]})}return n})();function gt(n,o){if(n&1){let t=UD();gl(0,"li")(1,"button",14),ag("click",function(){let a=Xu(t).$implicit,r=WD(2);return r.from=a,ed(r.showUpdatePath())}),gl(2,"span"),ow(3),ml()()();}if(n&2){let t=o.$implicit;SI(3),dg(t.name);}}function ht(n,o){if(n&1&&(gl(0,"ul",13),LD(1,gt,4,1,"li",null,kD),ml()),n&2){let t=WD();SI(),FD(t.versions);}}function bt(n,o){if(n&1){let t=UD();gl(0,"li")(1,"button",14),ag("click",function(){let a=Xu(t).$implicit,r=WD(2);return r.to=a,ed(r.showUpdatePath())}),gl(2,"span"),ow(3),ml()()();}if(n&2){let t=o.$implicit;SI(3),dg(t.name);}}function ft(n,o){if(n&1&&(gl(0,"ul",13),LD(1,bt,4,1,"li",null,kD),ml()),n&2){let t=WD();SI(),FD(t.versions);}}function vt(n,o){n&1&&(gl(0,"div",8)(1,"p")(2,"strong"),ow(3,"\u8B66\u544A\uFF1A"),ml(),ow(4," \u5F53\u524D\u4E3B\u8981\u7248\u672C\u4E4B\u540E\u7684\u53D1\u5E03\u8BA1\u5212\u5C1A\u672A\u6700\u7EC8\u786E\u5B9A\uFF0C\u53EF\u80FD\u4F1A\u6709\u53D8\u5316\u3002\u8FD9\u4E9B\u5EFA\u8BAE\u662F\u57FA\u4E8E\u8BA1\u5212\u4E2D\u7684\u5F03\u7528\u60C5\u51B5\u3002 "),ml()());}function _t(n,o){n&1&&(gl(0,"div",8)(1,"p")(2,"strong"),ow(3,"\u8B66\u544A\uFF1A"),ml(),ow(4," \u6211\u4EEC\u4E0D\u652F\u6301\u964D\u7EA7 Angular \u7248\u672C\u3002 "),ml()());}function yt(n,o){n&1&&(gl(0,"div",8)(1,"p")(2,"strong"),ow(3,"\u8B66\u544A\uFF1A"),ml(),ow(4," \u786E\u4FDD\u6309\u7167\u4EE5\u4E0B\u6307\u5357\u628A\u4F60\u7684\u5E94\u7528\u7A0B\u5E8F\u8FC1\u79FB\u5230\u65B0\u7248\u672C\u3002\u4F60\u6BCF\u6B21\u8FD0\u884C "),gl(5,"code"),ow(6,"ng update"),ml(),ow(7," \u65F6\u4E0D\u5E94\u8BE5\u8DF3\u8FC7\u4EFB\u4F55\u4E3B\u8981\u7248\u672C\u6765\u66F4\u65B0 Angular \u5E94\u7528\u7A0B\u5E8F\u3002 "),ml()());}function kt(n,o){n&1&&(gl(0,"p"),ow(1,"\u5C55\u793A\u6240\u6709 Angular \u5F00\u53D1\u8005\u90FD\u611F\u5174\u8DA3\u7684\u4FE1\u606F\u3002"),ml());}function xt(n,o){n&1&&(gl(0,"p"),ow(1,"\u5C55\u793A\u66F4\u9AD8\u7EA7 Angular \u5F00\u53D1\u8005\u4F1A\u611F\u5174\u8DA3\u7684\u4FE1\u606F\u3002"),ml());}function At(n,o){n&1&&(gl(0,"p"),ow(1,"\u5C55\u793A\u5173\u4E8E\u8FD9\u4E2A\u66F4\u65B0\u7684\u6240\u6709\u4FE1\u606F\u3002"),ml());}function It(n,o){if(n&1){let t=UD();gl(0,"div")(1,"mat-checkbox",15),ag("change",function(a){let r=Xu(t).$implicit,l=WD();return l.options[r.id]=a.checked,ed(l.showUpdatePath())}),ow(2),ml()();}if(n&2){let t=o.$implicit,i=WD();SI(),Wh("checked",i.options[t.id]),SI(),fg("\u6211\u4F7F\u7528\u4E86 ",t.name," ",t.description);}}function Ct(n,o){if(n&1){let t=UD();gl(0,"h4"),ow(1,"\u5305\u7BA1\u7406\u5668"),ml(),gl(2,"mat-button-toggle-group",16),ag("change",function(a){Xu(t);let r=WD();return r.packageManager=a.value,ed(r.showUpdatePath())}),gl(3,"mat-button-toggle",17),ow(4,"npm"),ml(),gl(5,"mat-button-toggle",18),ow(6,"yarn"),ml()();}if(n&2){let t=WD();SI(2),Wh("value",t.packageManager);}}function Mt(n,o){if(n&1&&(gl(0,"div",19),Xh(1,"mat-checkbox")(2,"div",20),ml()),n&2){let t=o.$implicit;SI(2),Wh("innerHTML",t.renderedStep,rI);}}function wt(n,o){n&1&&(gl(0,"div")(1,"em"),ow(2,"\u5728\u8FD9\u4E9B\u7248\u672C\u4E4B\u95F4\u5207\u6362\u4E4B\u524D\uFF0C\u4F60\u65E0\u9700\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002"),ml()());}function St(n,o){n&1&&(gl(0,"div")(1,"em"),ow(2,"\u8BF7\u5BA1\u6838\u8FD9\u4E9B\u66F4\u6539\u5E76\u6267\u884C\u8FD9\u4E9B\u64CD\u4F5C\u6765\u66F4\u65B0\u5E94\u7528\u7A0B\u5E8F\u3002"),ml()());}function Et(n,o){if(n&1&&(gl(0,"div",19),Xh(1,"mat-checkbox")(2,"div",20),ml()),n&2){let t=o.$implicit;SI(2),Wh("innerHTML",t.renderedStep,rI);}}function Ot(n,o){n&1&&(gl(0,"div")(1,"em"),ow(2,"\u5BF9\u8FD9\u4E9B\u7248\u672C\u4E4B\u95F4\u7684\u79FB\u52A8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u5EFA\u8BAE\u3002"),ml()());}function Tt(n,o){if(n&1&&(gl(0,"div",19),Xh(1,"mat-checkbox")(2,"div",20),ml()),n&2){let t=o.$implicit;SI(2),Wh("innerHTML",t.renderedStep,rI);}}function Dt(n,o){n&1&&(gl(0,"div")(1,"em"),ow(2,"\u5728\u5207\u6362\u8FD9\u4E9B\u7248\u672C\u4E4B\u540E\uFF0C\u4F60\u65E0\u9700\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002"),ml()());}function Rt(n,o){if(n&1&&(gl(0,"div",12)(1,"h2"),ow(2),ml(),gl(3,"h3"),ow(4,"\u5728\u66F4\u65B0\u4E4B\u524D"),ml(),LD(5,Mt,3,1,"div",19,kD),OD(7,wt,3,0,"div"),gl(8,"h3"),ow(9,"\u66F4\u65B0\u5230\u65B0\u7248\u672C"),ml(),OD(10,St,3,0,"div"),LD(11,Et,3,1,"div",19,kD),OD(13,Ot,3,0,"div"),gl(14,"h3"),ow(15,"\u66F4\u65B0\u4E4B\u540E"),ml(),LD(16,Tt,3,1,"div",19,kD),OD(18,Dt,3,0,"div"),ml()),n&2){let t=WD();SI(2),dg(t.title),SI(3),FD(t.beforeRecommendations),SI(2),AD(t.beforeRecommendations.length<=0?7:-1),SI(3),AD(t.duringRecommendations.length>0?10:-1),SI(),FD(t.duringRecommendations),SI(2),AD(t.duringRecommendations.length<=0?13:-1),SI(3),FD(t.afterRecommendations),SI(2),AD(t.afterRecommendations.length<=0?18:-1);}}var yi=(()=>{class n{title="";level=1;options={ngUpgrade:false,material:false,windows:et()};optionList=[{id:"ngUpgrade",name:"ngUpgrade",description:"\u5408\u5E76 AngularJS \u4E0E Angular"},{id:"material",name:"Angular Material",description:""},{id:"windows",name:"Windows",description:""}];packageManager="npm install";beforeRecommendations=[];duringRecommendations=[];afterRecommendations=[];versions=[{name:"19.0",number:1900},{name:"18.0",number:1800},{name:"17.0",number:1700},{name:"16.0",number:1600},{name:"15.0",number:1500},{name:"14.0",number:1400},{name:"13.0",number:1300},{name:"12.0",number:1200},{name:"11.0",number:1100},{name:"10.2",number:1020},{name:"10.1",number:1010},{name:"10.0",number:1e3},{name:"9.1",number:910},{name:"9.0",number:900},{name:"8.2",number:820},{name:"8.1",number:810},{name:"8.0",number:800},{name:"7.2",number:720},{name:"7.1",number:710},{name:"7.0",number:700},{name:"6.1",number:610},{name:"6.0",number:600},{name:"5.2",number:520},{name:"5.1",number:510},{name:"5.0",number:500},{name:"4.4",number:440},{name:"4.3",number:430},{name:"4.2",number:420},{name:"4.1",number:410},{name:"4.0",number:400},{name:"2.4",number:204},{name:"2.3",number:203},{name:"2.2",number:202},{name:"2.1",number:201},{name:"2.0",number:200}];from=this.versions.find(t=>t.name==="17.0");to=this.versions.find(t=>t.name==="18.0");futureVersion=2e3;steps=ze;clipboard=D(Ve);router=D(an);activatedRoute=D(Se);constructor(){let t=this.activatedRoute.snapshot.queryParamMap;this.level=parseInt(t.get("l"),10)||this.level;let i=t.get("v");if(i){let[a,r]=i.split("-");this.from=this.versions.find(l=>l.name===a),this.to=this.versions.find(l=>l.name===r),this.showUpdatePath();}}copyCode({tagName:t,textContent:i}){t==="CODE"&&this.clipboard.copy(i);}async showUpdatePath(){if(this.beforeRecommendations=[],this.duringRecommendations=[],this.afterRecommendations=[],this.to.number<this.from.number){alert("\u6211\u4EEC\u4E0D\u652F\u6301\u964D\u7EA7 Angular \u7248\u672C\u3002");return}let t="Angular \u5E94\u7528\u7A0B\u5E8F\u66F4\u65B0\u6307\u5357",i="\u57FA\u7840\u5E94\u7528",a="\u4E2D\u7B49\u5E94\u7528",r="\u9AD8\u7EA7\u5E94\u7528";this.title=`${t} v${this.from.name} -> v${this.to.name}
for
${this.level<2?i:this.level<3?a:r}`;for(let l of this.steps)if(l.level<=this.level&&l.necessaryAsOf>this.from.number){let h=false;for(let j of this.optionList)l[j.id]&&!this.options[j.id]&&(h=true),l[j.id]===false&&this.options[j.id]&&(h=true);if(h)continue;l.renderedStep=await g(this.replaceVariables(l.action)),l.possibleIn<=this.from.number&&l.necessaryAsOf>=this.from.number?this.beforeRecommendations.push(l):l.possibleIn>this.from.number&&l.necessaryAsOf<=this.to.number?this.duringRecommendations.push(l):l.possibleIn<=this.to.number&&this.afterRecommendations.push(l);}this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{v:`${this.from.name}-${this.to.name}`,l:this.level},queryParamsHandling:"merge"}),this.renderPreV6Instructions();}getAdditionalDependencies(t){return t<500?"typescript@'>=2.1.0 <2.4.0'":t<600?"[email protected] rxjs@^5.5.2":"[email protected] rxjs@^6.0.0"}getAngularVersion(t){if(t<400)return "'^2.0.0'";{let i=Math.floor(t/100),a=Math.floor((t-i*100)/10);return `^${i}.${a}.0`}}async renderPreV6Instructions(){let t,i=this.getAdditionalDependencies(this.to.number),a=this.getAngularVersion(this.to.number),r=["animations","common","compiler","compiler-cli","core","forms","http","platform-browser","platform-browser-dynamic","platform-server","router"];if(this.to.number<600){let l="\u5C06\u6240\u6709\u4F9D\u8D56\u9879\u66F4\u65B0\u5230\u6700\u65B0\u7684 Angular \u548C\u6B63\u786E\u7248\u672C\u7684 TypeScript\u3002";if(et()){let h=r.map(j=>`@angular/${j}@${a}`).join(" ")+" "+i;t={step:"\u4E00\u822C\u66F4\u65B0",action:`${l}
\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Windows\uFF0C\u5219\u53EF\u4EE5\u7528\uFF1A
\`${this.packageManager} ${h}\``};}else {let h=`@angular/{${r.join(",")}}@${a} ${i}`;t={step:"\u4E00\u822C\u66F4\u65B0",action:`${l}
\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Linux/Mac\uFF0C\u5219\u53EF\u4EE5\u7528\uFF1A
\`${this.packageManager} ${h}\``};}this.packageManager==="npm install"&&this.to.number===500&&(t.action+="\n\n`npm install [email protected] --save-exact`"),t.renderedStep=await g(t.action),this.duringRecommendations.push(t);}}replaceVariables(t){let i=t;return i=i.replace("${packageManagerGlobalInstall}",this.packageManager==="npm install"?"npm install -g":"yarn global add"),i=i.replace("${packageManagerInstall}",this.packageManager),i}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=Db({type:n,selectors:[["adev-update-guide"]],hostBindings:function(i,a){i&1&&ag("click",function(l){return a.copyCode(l.target)});},decls:53,vars:15,consts:[["templatesMenuFrom",""],["templatesMenuTo",""],[1,"page","docs-viewer"],["tabindex","-1"],[1,"wizard"],[1,"adev-version-selector"],[1,"adev-template-select"],[3,"cdkMenuTriggerFor"],[1,"docs-alert","docs-alert-critical"],[2,"margin-bottom","16px",3,"change","value"],[3,"value"],["type","button",1,"docs-primary-btn","show-button",3,"click"],[1,"recommendations"],["cdkMenu","",1,"adev-template-dropdown"],["cdkMenuItem","","type","button",3,"click"],[3,"change","checked"],[3,"change","value"],["value","npm install"],["value","yarn add"],[1,"adev-recommentation-item"],[3,"innerHTML"]],template:function(i,a){if(i&1){let r=UD();gl(0,"div",2)(1,"h1",3),ow(2,"\u66F4\u65B0\u6307\u5357"),ml(),gl(3,"div",4)(4,"div")(5,"h2"),ow(6,"\u9009\u62E9\u4E0E\u4F60\u7684\u66F4\u65B0\u76F8\u5339\u914D\u7684\u9009\u9879"),ml(),gl(7,"h3"),ow(8,"Angular \u7248\u672C"),ml(),gl(9,"div",5)(10,"span",6),ow(11," \u4ECE v. "),gl(12,"button",7)(13,"span"),ow(14),ml(),gl(15,"docs-icon"),ow(16,"expand_more"),ml()(),Sh(17,ht,3,0,"ng-template",null,0,ww),ml(),gl(19,"span")(20,"span",6),ow(21," \u5230 v. "),gl(22,"button",7)(23,"span"),ow(24),ml(),gl(25,"docs-icon"),ow(26,"expand_more"),ml()(),Sh(27,ft,3,0,"ng-template",null,1,ww),ml()()(),OD(29,vt,5,0,"div",8),OD(30,_t,5,0,"div",8),OD(31,yt,8,0,"div",8),gl(32,"h3"),ow(33,"\u5E94\u7528\u7A0B\u5E8F\u590D\u6742\u6027"),ml(),gl(34,"mat-button-toggle-group",9),ag("change",function(h){return Xu(r),ed(a.level=h.value)}),gl(35,"mat-button-toggle",10),ow(36,"\u57FA\u7840"),ml(),gl(37,"mat-button-toggle",10),ow(38,"\u4E2D\u7B49"),ml(),gl(39,"mat-button-toggle",10),ow(40,"\u9AD8\u7EA7"),ml()(),OD(41,kt,2,0,"p")(42,xt,2,0,"p")(43,At,2,0,"p"),gl(44,"h3"),ow(45,"\u5176\u4ED6\u4F9D\u8D56\u9879"),ml(),LD(46,It,3,3,"div",null,kD),OD(48,Ct,7,1),gl(49,"button",11),ag("click",function(){return Xu(r),ed(a.showUpdatePath())}),ow(50," \u544A\u8BC9\u6211\u5982\u4F55\u66F4\u65B0 "),ml()()(),Xh(51,"hr"),OD(52,Rt,19,5,"div",12),ml();}if(i&2){let r=rw(18),l=rw(28);SI(12),Wh("cdkMenuTriggerFor",r),SI(2),dg(a.from.name),SI(8),Wh("cdkMenuTriggerFor",l),SI(2),dg(a.to.name),SI(5),AD(a.from.number>=a.futureVersion||a.to.number>=a.futureVersion?29:-1),SI(),AD(a.from.number>a.to.number?30:-1),SI(),AD(a.to.number-a.from.number>150&&a.from.number>240?31:-1),SI(3),Wh("value",a.level),SI(),Wh("value",1),SI(2),Wh("value",2),SI(2),Wh("value",3),SI(2),AD(a.level===1?41:a.level===2?42:a.level===3?43:-1),SI(5),FD(a.optionList),SI(2),AD(a.from.number<600?48:-1),SI(),$h("text","\u544A\u8BC9\u6211\u5982\u4F55\u66F4\u65B0\uFF01"),SI(3),AD(a.beforeRecommendations.length>0||a.duringRecommendations.length>0||a.afterRecommendations.length>0?52:-1);}},dependencies:[$e,fe,We,Ke,Ze,Je,ye,re,st,nt$1,De,Se$1,Xe$1],styles:[".page[_ngcontent-%COMP%]{padding:var(--layout-padding);max-width:var(--page-width);container:update-guide-page/inline-size}h3[_ngcontent-%COMP%], h4[_ngcontent-%COMP%]{margin-block-start:2em}.wizard[_ngcontent-%COMP%]{padding-inline:1rem}.wizard[_ngcontent-%COMP%] .show-button[_ngcontent-%COMP%]{display:block;margin-block-start:2rem}.adev-version-selector[_ngcontent-%COMP%]{display:flex;gap:1rem}.adev-template-dropdown[_ngcontent-%COMP%]{border:1px solid var(--senary-contrast);border-radius:.25rem;padding:0;transform:translateY(-.7rem);max-height:200px;overflow-y:auto}.adev-template-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{list-style:none;width:198px;box-sizing:border-box}.adev-template-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background:var(--page-background);font-size:.875rem;width:100%;text-align:left;padding-block:.5rem;color:var(--quaternary-contrast);transition:color .3s ease,background .3s ease;font-weight:400}.adev-template-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--senary-contrast);color:var(--primary-contrast)}.adev-template-select[_ngcontent-%COMP%]{margin-block-end:.5rem}.adev-template-select[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{font-size:.875rem;border:1px solid var(--senary-contrast);border-radius:.25rem;width:200px;display:inline-flex;justify-content:space-between;align-items:center;padding-block:.5rem;font-weight:400;transition:border .3s ease}.adev-template-select[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--primary-contrast);transition:color .3s ease;margin-inline-start:.1rem}.adev-template-select[_ngcontent-%COMP%] button[_ngcontent-%COMP%] docs-icon[_ngcontent-%COMP%]{font-size:1.3rem;color:var(--quaternary-contrast);transition:color .3s ease}.adev-recommentation-item[_ngcontent-%COMP%]{display:flex;align-items:center}.adev-recommentation-item[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin-inline-start:2rem}.adev-recommentation-item[_ngcontent-%COMP%] code{cursor:pointer}"],changeDetection:0})}return n})();function et(){if(typeof navigator>"u")return false;let n=navigator.platform.toLowerCase();return n.includes("windows")||n.includes("win32")}export{yi as default};