-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathchunk-FOUC3CUN.js
9 lines (7 loc) · 168 KB
/
chunk-FOUC3CUN.js
1
2
3
4
5
6
7
8
9
import{a as be}from"./chunk-CU6SR552.js";import{a as Ne,b as je,c as He,d as Ve}from"./chunk-T7S57SFR.js";import"./chunk-UFY6AFO4.js";import"./chunk-MABOOWEJ.js";import{H as Pe,j as Te,p as Re,r as De,t as b,u as ge,v as ee,w as Be,x as Le,z as ze}from"./chunk-RAJBATEM.js";import{L as Fe,a as de,b as Me}from"./chunk-E4I7JNBM.js";import{o as Ee,t as Se}from"./chunk-6KKW6GNI.js";import"./chunk-WXI33M2S.js";import{$ as te,$b as Ce,Ab as H,Ba as J,Cb as V,Db as U,Eb as r,Fa as z,Fb as l,Ga as j,Gb as I,Gc as he,Kb as M,Lb as ae,Ma as Ie,Nb as g,Oc as le,Pa as ne,Pb as O,Qb as G,Rb as q,Tb as oe,Ub as $,Va as m,Vb as D,Wa as f,Wb as B,Xb as P,Yb as u,Zb as Y,aa as ue,ba as y,bc as Q,cb as X,cc as L,da as K,fa as pe,ga as ie,jb as W,jc as re,ma as F,na as k,nb as C,oa as T,tb as S,uc as Z,va as fe,vb as p,wa as x,xa as v,xb as R,xc as w,ya as ke,yb as we,yc as Oe,za as Ae,zb as A}from"./chunk-FNSPSJSE.js";var e=function(o){return o[o.Basic=1]="Basic",o[o.Medium=2]="Medium",o[o.Advanced=3]="Advanced",o}(e||{}),Ue=[{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\u5EA6\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 \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:!0,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\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:!0,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 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\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:!1,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:!0,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:!1,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:!0,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:!1,material:!0,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:!0,material:!0,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:!1,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:!0,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:!1,material:!0,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:!0,material:!0,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:!0,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:!0,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:!1,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:!0,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:!1,material:!0,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:!0,material:!0,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:!0,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:!1,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:!0,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:!1,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:!0,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:!1,material:!0,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:!0,material:!0,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:!1,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:!0,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:!0,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/en-US/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/en-US/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/en-US/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:!0,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.io/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:!0,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:!0,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:!0,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:!0,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:!0,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:!0,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:!0,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:!0,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:!0,step:"v14 CdkStepper orientation",action:"\u4F7F\u7528 `CdkStepper.orientation`\uFF0C\u800C\u4E0D\u662F `CdkStepper._orientation`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:!0,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:!0,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:!0,step:"v14 MatSelectionListChange.option",action:"\u4F7F\u7528 `MatSelectionListChange.options`\uFF0C\u800C\u4E0D\u662F `MatSelectionListChange.option`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:!0,step:"v14 getHarnessLoaderForContent",action:"\u4F7F\u7528 `getChildLoader(MatListItemSection.CONTENT)`\uFF0C\u800C\u4E0D\u662F `getHarnessLoaderForContent`\u3002"},{possibleIn:1400,necessaryAsOf:1400,level:e.Advanced,material:!0,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" alt="\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" alt="\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" alt="\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" alt="\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" alt="\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" alt="\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" alt="\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' alt='\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" alt="\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" alt="\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" alt="\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" alt="\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" alt="\u6709\u5173\u6B64\u66F4\u6539\u7684\u66F4\u591A\u4FE1\u606F">\u7EE7\u7EED\u9605\u8BFB</a>'},{possibleIn:1500,necessaryAsOf:1500,level:e.Basic,material:!0,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" alt="\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:!0,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 `ActiveRoute` \u7684\u6D4B\u8BD5\u3002[\u7EE7\u7EED\u9605\u8BFB](https://github.com/angular/angular/blob/main/CHANGELOG.md#1600-next1-2023-03-01)"},{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 v16 \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:!0,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:!0,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-out 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"}];var xe=class{constructor(a,s){this._document=s;let t=this._textarea=this._document.createElement("textarea"),n=t.style;n.position="fixed",n.top=n.opacity="0",n.left="-999em",t.setAttribute("aria-hidden","true"),t.value=a,t.readOnly=!0,(this._document.fullscreenElement||this._document.body).appendChild(t)}copy(){let a=this._textarea,s=!1;try{if(a){let t=this._document.activeElement;a.select(),a.setSelectionRange(0,a.value.length),s=this._document.execCommand("copy"),t&&t.focus()}}catch{}return s}destroy(){let a=this._textarea;a&&(a.remove(),this._textarea=void 0)}},Ge=(()=>{let a=class a{constructor(t){this._document=t}copy(t){let n=this.beginCopy(t),i=n.copy();return n.destroy(),i}beginCopy(t){return new xe(t,this._document)}};a.\u0275fac=function(n){return new(n||a)(pe(he))},a.\u0275prov=ue({token:a,factory:a.\u0275fac,providedIn:"root"});let o=a;return o})();var nt=["input"],at=["label"],ot=["*"],rt=new K("mat-checkbox-default-options",{providedIn:"root",factory:$e});function $e(){return{color:"accent",clickAction:"check-indeterminate"}}var _=function(o){return o[o.Init=0]="Init",o[o.Checked=1]="Checked",o[o.Unchecked=2]="Unchecked",o[o.Indeterminate=3]="Indeterminate",o}(_||{}),lt={provide:de,useExisting:te(()=>ce),multi:!0},ve=class{},dt=0,qe=$e(),ce=(()=>{let a=class a{focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(t){let n=new ve;return n.source=this,n.checked=t,n}_getAnimationTargetElement(){return this._inputElement?.nativeElement}get inputId(){return`${this.id||this._uniqueId}-input`}constructor(t,n,i,d,c,h){this._elementRef=t,this._changeDetectorRef=n,this._ngZone=i,this._animationMode=c,this._options=h,this._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"},this.ariaLabel="",this.ariaLabelledby=null,this.labelPosition="after",this.name=null,this.change=new j,this.indeterminateChange=new j,this._onTouched=()=>{},this._currentAnimationClass="",this._currentCheckState=_.Init,this._controlValueAccessorChangeFn=()=>{},this._validatorChangeFn=()=>{},this._checked=!1,this._disabled=!1,this._indeterminate=!1,this._options=this._options||qe,this.color=this._options.color||qe.color,this.tabIndex=parseInt(d)||0,this.id=this._uniqueId=`mat-mdc-checkbox-${++dt}`}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())}get disabled(){return this._disabled}set disabled(t){t!==this.disabled&&(this._disabled=t,this._changeDetectorRef.markForCheck())}get indeterminate(){return this._indeterminate}set indeterminate(t){let n=t!=this._indeterminate;this._indeterminate=t,n&&(this._indeterminate?this._transitionCheckState(_.Indeterminate):this._transitionCheckState(this.checked?_.Checked:_.Unchecked),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}_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!==!0?{required:!0}:null}registerOnValidatorChange(t){this._validatorChangeFn=t}_transitionCheckState(t){let n=this._currentCheckState,i=this._getAnimationTargetElement();if(!(n===t||!i)&&(this._currentAnimationClass&&i.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(n,t),this._currentCheckState=t,this._currentAnimationClass.length>0)){i.classList.add(this._currentAnimationClass);let d=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{i.classList.remove(d)},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=!1,this.indeterminateChange.emit(this._indeterminate)}),this._checked=!this._checked,this._transitionCheckState(this._checked?_.Checked:_.Unchecked),this._emitChangeEvent()):!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,n){if(this._animationMode==="NoopAnimations")return"";switch(t){case _.Init:if(n===_.Checked)return this._animationClasses.uncheckedToChecked;if(n==_.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case _.Unchecked:return n===_.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case _.Checked:return n===_.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case _.Indeterminate:return n===_.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(t){let n=this._inputElement;n&&(n.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()}};a.\u0275fac=function(n){return new(n||a)(f(z),f(Z),f(X),J("tabindex"),f(Ie,8),f(rt,8))},a.\u0275cmp=F({type:a,selectors:[["mat-checkbox"]],viewQuery:function(n,i){if(n&1&&($(nt,5),$(at,5),$(ee,5)),n&2){let d;D(d=B())&&(i._inputElement=d.first),D(d=B())&&(i._labelElement=d.first),D(d=B())&&(i.ripple=d.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:14,hostBindings:function(n,i){n&2&&(ae("id",i.id),S("tabindex",null)("aria-label",null)("aria-labelledby",null),we(i.color?"mat-"+i.color:"mat-accent"),R("_mat-animation-noopable",i._animationMode==="NoopAnimations")("mdc-checkbox--disabled",i.disabled)("mat-mdc-checkbox-disabled",i.disabled)("mat-mdc-checkbox-checked",i.checked))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],id:"id",required:[2,"required","required",w],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",w],tabIndex:[2,"tabIndex","tabIndex",t=>t==null?void 0:Oe(t)],color:"color",checked:[2,"checked","checked",w],disabled:[2,"disabled","disabled",w],indeterminate:[2,"indeterminate","indeterminate",w]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],standalone:!0,features:[Q([lt,{provide:Me,useExisting:a,multi:!0}]),W,fe,L],ngContentSelectors:ot,decls:15,vars:19,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-mdc-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(n,i){if(n&1){let d=M();G(),r(0,"div",3),g("click",function(h){return x(d),v(i._preventBubblingFromLabel(h))}),r(1,"div",4,0)(3,"div",5),g("click",function(){return x(d),v(i._onTouchTargetClick())}),l(),r(4,"input",6,1),g("blur",function(){return x(d),v(i._onBlur())})("click",function(){return x(d),v(i._onInputClick())})("change",function(h){return x(d),v(i._onInteractionEvent(h))}),l(),I(6,"div",7),r(7,"div",8),ke(),r(8,"svg",9),I(9,"path",10),l(),Ae(),I(10,"div",11),l(),I(11,"div",12),l(),r(12,"label",13,2),q(14),l()()}if(n&2){let d=P(2);p("labelPosition",i.labelPosition),m(4),R("mdc-checkbox--selected",i.checked),p("checked",i.checked)("indeterminate",i.indeterminate)("disabled",i.disabled)("id",i.inputId)("required",i.required)("tabIndex",i.disabled?-1:i.tabIndex),S("aria-label",i.ariaLabel||null)("aria-labelledby",i.ariaLabelledby)("aria-describedby",i.ariaDescribedby)("aria-checked",i.indeterminate?"mixed":null)("name",i.name)("value",i.value),m(7),p("matRippleTrigger",d)("matRippleDisabled",i.disableRipple||i.disabled)("matRippleCentered",!0),m(),p("for",i.inputId)}},dependencies:[ee,ze],styles:['.mdc-touch-target-wrapper{display:inline}@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:mdc-animation-deceleration-curve-timing-function;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}}.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}.mdc-checkbox[hidden]{display:none}.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__focus-ring,.mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__focus-ring{pointer-events:none;border:2px solid rgba(0,0,0,0);border-radius:6px;box-sizing:content-box;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);height:100%;width:100%}@media screen and (forced-colors: active){.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__focus-ring,.mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__focus-ring{border-color:CanvasText}}.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__focus-ring::after,.mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__focus-ring::after{content:"";border:2px solid rgba(0,0,0,0);border-radius:8px;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);height:calc(100% + 4px);width:calc(100% + 4px)}@media screen and (forced-colors: active){.mdc-checkbox.mdc-ripple-upgraded--background-focused .mdc-checkbox__focus-ring::after,.mdc-checkbox:not(.mdc-ripple-upgraded):focus .mdc-checkbox__focus-ring::after{border-color:CanvasText}}@media all and (-ms-high-contrast: none){.mdc-checkbox .mdc-checkbox__focus-ring{display:none}}@media screen and (forced-colors: active),(-ms-high-contrast: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.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 0ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox--upgraded .mdc-checkbox__checkmark{opacity:1}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms 0ms 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 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.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 0s;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear 0s;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear 0s;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background{transition:border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background .mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background .mdc-checkbox__checkmark-path,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit}.mdc-checkbox__native-control:disabled{cursor:default;pointer-events:none}.mdc-checkbox--touch{margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}.mdc-checkbox--touch .mdc-checkbox__native-control{top:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);right:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);left:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);width:var(--mdc-checkbox-state-layer-size);height:var(--mdc-checkbox-state-layer-size)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background .mdc-checkbox__checkmark{transition:opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1),transform 180ms 0ms 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,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background .mdc-checkbox__mixedmark,.mdc-checkbox__native-control[data-indeterminate=true]~.mdc-checkbox__background .mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__checkmark-path,.mdc-checkbox.mdc-checkbox--upgraded .mdc-checkbox__mixedmark{transition:none}.mdc-checkbox{padding:calc((var(--mdc-checkbox-state-layer-size) - 18px) / 2);margin:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2)}.mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color);background-color:transparent}.mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{border-color:transparent;background-color:var(--mdc-checkbox-disabled-selected-icon-color)}.mdc-checkbox .mdc-checkbox__native-control:enabled~.mdc-checkbox__background .mdc-checkbox__checkmark{color:var(--mdc-checkbox-selected-checkmark-color)}.mdc-checkbox .mdc-checkbox__native-control:enabled~.mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:var(--mdc-checkbox-selected-checkmark-color)}.mdc-checkbox .mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__checkmark{color:var(--mdc-checkbox-disabled-selected-checkmark-color)}.mdc-checkbox .mdc-checkbox__native-control:disabled~.mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:var(--mdc-checkbox-disabled-selected-checkmark-color)}.mdc-checkbox .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-icon-color);background-color:transparent}.mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-icon-color);background-color:var(--mdc-checkbox-selected-icon-color)}@keyframes mdc-checkbox-fade-in-background-8A000000FFF4433600000000FFF44336{0%{border-color:var(--mdc-checkbox-unselected-icon-color);background-color:transparent}50%{border-color:var(--mdc-checkbox-selected-icon-color);background-color:var(--mdc-checkbox-selected-icon-color)}}@keyframes mdc-checkbox-fade-out-background-8A000000FFF4433600000000FFF44336{0%,80%{border-color:var(--mdc-checkbox-selected-icon-color);background-color:var(--mdc-checkbox-selected-icon-color)}100%{border-color:var(--mdc-checkbox-unselected-icon-color);background-color:transparent}}.mdc-checkbox.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-in-background-8A000000FFF4433600000000FFF44336}.mdc-checkbox.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-out-background-8A000000FFF4433600000000FFF44336}.mdc-checkbox:hover .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-hover-icon-color);background-color:transparent}.mdc-checkbox:hover .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox:hover .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-checkbox:hover .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-hover-icon-color);background-color:var(--mdc-checkbox-selected-hover-icon-color)}@keyframes mdc-checkbox-fade-in-background-FF212121FFF4433600000000FFF44336{0%{border-color:var(--mdc-checkbox-unselected-hover-icon-color);background-color:transparent}50%{border-color:var(--mdc-checkbox-selected-hover-icon-color);background-color:var(--mdc-checkbox-selected-hover-icon-color)}}@keyframes mdc-checkbox-fade-out-background-FF212121FFF4433600000000FFF44336{0%,80%{border-color:var(--mdc-checkbox-selected-hover-icon-color);background-color:var(--mdc-checkbox-selected-hover-icon-color)}100%{border-color:var(--mdc-checkbox-unselected-hover-icon-color);background-color:transparent}}.mdc-checkbox:hover.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox:hover.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-in-background-FF212121FFF4433600000000FFF44336}.mdc-checkbox:hover.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox:hover.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-out-background-FF212121FFF4433600000000FFF44336}.mdc-checkbox:not(:disabled):active .mdc-checkbox__native-control:enabled:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-pressed-icon-color);background-color:transparent}.mdc-checkbox:not(:disabled):active .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox:not(:disabled):active .mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background,.mdc-checkbox:not(:disabled):active .mdc-checkbox__native-control[data-indeterminate=true]:enabled~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-pressed-icon-color);background-color:var(--mdc-checkbox-selected-pressed-icon-color)}@keyframes mdc-checkbox-fade-in-background-8A000000FFF4433600000000FFF44336{0%{border-color:var(--mdc-checkbox-unselected-pressed-icon-color);background-color:transparent}50%{border-color:var(--mdc-checkbox-selected-pressed-icon-color);background-color:var(--mdc-checkbox-selected-pressed-icon-color)}}@keyframes mdc-checkbox-fade-out-background-8A000000FFF4433600000000FFF44336{0%,80%{border-color:var(--mdc-checkbox-selected-pressed-icon-color);background-color:var(--mdc-checkbox-selected-pressed-icon-color)}100%{border-color:var(--mdc-checkbox-unselected-pressed-icon-color);background-color:transparent}}.mdc-checkbox:not(:disabled):active.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox:not(:disabled):active.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-in-background-8A000000FFF4433600000000FFF44336}.mdc-checkbox:not(:disabled):active.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background,.mdc-checkbox:not(:disabled):active.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__native-control:enabled~.mdc-checkbox__background{animation-name:mdc-checkbox-fade-out-background-8A000000FFF4433600000000FFF44336}.mdc-checkbox .mdc-checkbox__background{top:calc((var(--mdc-checkbox-state-layer-size) - 18px) / 2);left:calc((var(--mdc-checkbox-state-layer-size) - 18px) / 2)}.mdc-checkbox .mdc-checkbox__native-control{top:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);right:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);left:calc((var(--mdc-checkbox-state-layer-size) - var(--mdc-checkbox-state-layer-size)) / 2);width:var(--mdc-checkbox-state-layer-size);height:var(--mdc-checkbox-state-layer-size)}.mdc-checkbox .mdc-checkbox__native-control:enabled:focus:focus:not(:checked):not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-focus-icon-color)}.mdc-checkbox .mdc-checkbox__native-control:enabled:focus:checked~.mdc-checkbox__background,.mdc-checkbox .mdc-checkbox__native-control:enabled:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-focus-icon-color);background-color:var(--mdc-checkbox-selected-focus-icon-color)}.mdc-checkbox:hover .mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-hover-state-layer-opacity);background-color:var(--mdc-checkbox-unselected-hover-state-layer-color)}.mdc-checkbox:hover .mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color)}.mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-focus-state-layer-opacity);background-color:var(--mdc-checkbox-unselected-focus-state-layer-color)}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-focus-state-layer-color)}.mdc-checkbox:active .mdc-checkbox__native-control~.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-pressed-state-layer-opacity);background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color)}.mdc-checkbox:active .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color)}.mdc-checkbox:hover .mdc-checkbox__native-control:checked~.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-hover-state-layer-opacity);background-color:var(--mdc-checkbox-selected-hover-state-layer-color)}.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)}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-focus-state-layer-opacity);background-color:var(--mdc-checkbox-selected-focus-state-layer-color)}.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)}.mdc-checkbox:active .mdc-checkbox__native-control:checked~.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-pressed-state-layer-opacity);background-color:var(--mdc-checkbox-selected-pressed-state-layer-color)}.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)}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox .mdc-checkbox__background{-webkit-print-color-adjust:exact;color-adjust:exact}.mat-mdc-checkbox._mat-animation-noopable *,.mat-mdc-checkbox._mat-animation-noopable *::before{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);font-family:var(--mat-checkbox-label-text-font);line-height:var(--mat-checkbox-label-text-line-height);font-size:var(--mat-checkbox-label-text-size);letter-spacing:var(--mat-checkbox-label-text-tracking);font-weight:var(--mat-checkbox-label-text-weight)}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color)}.mat-mdc-checkbox label:empty{display:none}.cdk-high-contrast-active .mat-mdc-checkbox.mat-mdc-checkbox-disabled{opacity:.5}.cdk-high-contrast-active .mat-mdc-checkbox .mdc-checkbox__checkmark{--mdc-checkbox-selected-checkmark-color: CanvasText;--mdc-checkbox-disabled-selected-checkmark-color: CanvasText}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.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-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%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display)}.mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus~.mat-mdc-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0});let o=a;return o})();var Ye=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[ce,b,b]});let o=a;return o})();var Qe=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({});let o=a;return o})();var _e=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[b,le,Te,b]});let o=a;return o})();var Xe=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[b,_e,_e,Qe,b]});let o=a;return o})();var We=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[b,le,b]});let o=a;return o})();var Ze=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[ge,b,ge,b]});let o=a;return o})();var st=["button"],mt=["*"];function ut(o,a){if(o&1&&I(0,"mat-pseudo-checkbox",3),o&2){let s=O();p("disabled",s.disabled)}}function pt(o,a){if(o&1&&I(0,"mat-pseudo-checkbox",3),o&2){let s=O();p("disabled",s.disabled)}}var Ke=new K("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:ft});function ft(){return{hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1}}var Je=new K("MatButtonToggleGroup"),ht={provide:de,useExisting:te(()=>ye),multi:!0},et=0,se=class{constructor(a,s){this.source=a,this.value=s}},ye=(()=>{let a=class a{get name(){return this._name}set name(t){this._name=t,this._markButtonsForCheck()}get value(){let t=this._selectionModel?this._selectionModel.selected:[];return this.multiple?t.map(n=>n.value):t[0]?t[0].value:void 0}set value(t){this._setSelectionByValue(t),this.valueChange.emit(this.value)}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 dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(t){this._hideSingleSelectionIndicator=t,this._markButtonsForCheck()}get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(t){this._hideMultipleSelectionIndicator=t,this._markButtonsForCheck()}constructor(t,n,i){this._changeDetector=t,this._dir=i,this._multiple=!1,this._disabled=!1,this._controlValueAccessorChangeFn=()=>{},this._onTouched=()=>{},this._name=`mat-button-toggle-group-${et++}`,this.valueChange=new j,this.change=new j,this.appearance=n&&n.appearance?n.appearance:"standard",this.hideSingleSelectionIndicator=n?.hideSingleSelectionIndicator??!1,this.hideMultipleSelectionIndicator=n?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new Pe(this.multiple,void 0,!1)}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 i=t.target.id,d=this._buttonToggles.toArray().findIndex(h=>h.buttonId===i),c;switch(t.keyCode){case 32:case 13:c=this._buttonToggles.get(d);break;case 38:c=this._buttonToggles.get(this._getNextIndex(d,-1));break;case 37:c=this._buttonToggles.get(this._getNextIndex(d,this.dir==="ltr"?-1:1));break;case 40:c=this._buttonToggles.get(this._getNextIndex(d,1));break;case 39:c=this._buttonToggles.get(this._getNextIndex(d,this.dir==="ltr"?1:-1));break;default:return}t.preventDefault(),c?._onButtonClick(),c?.focus()}_emitChangeEvent(t){let n=new se(t,this.value);this._rawValue=n.value,this._controlValueAccessorChangeFn(n.value),this.change.emit(n)}_syncButtonToggle(t,n,i=!1,d=!1){!this.multiple&&this.selected&&!t.checked&&(this.selected.checked=!1),this._selectionModel?n?this._selectionModel.select(t):this._selectionModel.deselect(t):d=!0,d?Promise.resolve().then(()=>this._updateModelValue(t,i)):this._updateModelValue(t,i)}_isSelected(t){return this._selectionModel&&this._selectionModel.isSelected(t)}_isPrechecked(t){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(n=>t.value!=null&&n===t.value):t.value===this._rawValue}_initializeTabIndex(){this._buttonToggles.forEach(t=>{t.tabIndex=-1}),this.selected?this.selected.tabIndex=0:this._buttonToggles.length>0&&(this._buttonToggles.get(0).tabIndex=0),this._markButtonsForCheck()}_getNextIndex(t,n){let i=t+n;return i===this._buttonToggles.length&&(i=0),i===-1&&(i=this._buttonToggles.length-1),i}_setSelectionByValue(t){this._rawValue=t,this._buttonToggles&&(this.multiple&&t?(Array.isArray(t),this._clearSelection(),t.forEach(n=>this._selectValue(n))):(this._clearSelection(),this._selectValue(t)))}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(t=>{t.checked=!1,this.multiple||(t.tabIndex=-1)})}_selectValue(t){let n=this._buttonToggles.find(i=>i.value!=null&&i.value===t);n&&(n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0))}_updateModelValue(t,n){n&&this._emitChangeEvent(t),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(t=>t._markForCheck())}};a.\u0275fac=function(n){return new(n||a)(f(Z),f(Ke,8),f(De,8))},a.\u0275dir=T({type:a,selectors:[["mat-button-toggle-group"]],contentQueries:function(n,i,d){if(n&1&&oe(d,me,5),n&2){let c;D(c=B())&&(i._buttonToggles=c)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(n,i){n&1&&g("keydown",function(c){return i._keydown(c)}),n&2&&(S("role",i.multiple?"group":"radiogroup")("aria-disabled",i.disabled),R("mat-button-toggle-vertical",i.vertical)("mat-button-toggle-group-appearance-standard",i.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",w],value:"value",multiple:[2,"multiple","multiple",w],disabled:[2,"disabled","disabled",w],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",w],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",w]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],standalone:!0,features:[Q([ht,{provide:Je,useExisting:a}]),W]});let o=a;return o})(),me=(()=>{let a=class a{get buttonId(){return`${this.id}-button`}get tabIndex(){return this._tabIndex}set tabIndex(t){this._tabIndex=t,this._markForCheck()}get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(t){this._appearance=t}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}constructor(t,n,i,d,c,h){this._changeDetectorRef=n,this._elementRef=i,this._focusMonitor=d,this._checked=!1,this.ariaLabelledby=null,this._disabled=!1,this.change=new j;let E=Number(c);this.tabIndex=E||E===0?E:null,this.buttonToggleGroup=t,this.appearance=h&&h.appearance?h.appearance:"standard"}ngOnInit(){let t=this.buttonToggleGroup;this.id=this.id||`mat-button-toggle-${et++}`,t&&(t._isPrechecked(this)?this.checked=!0:t._isSelected(this)!==this._checked&&t._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let t=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),t&&t._isSelected(this)&&t._syncButtonToggle(this,!1,!1,!0)}focus(t){this._buttonElement.nativeElement.focus(t)}_onButtonClick(){let t=this.isSingleSelector()?!0:!this._checked;if(t!==this._checked&&(this._checked=t,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let n=this.buttonToggleGroup._buttonToggles.find(i=>i.tabIndex===0);n&&(n.tabIndex=-1),this.tabIndex=0}this.change.emit(new se(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}};a.\u0275fac=function(n){return new(n||a)(f(Je,8),f(Z),f(z),f(Re),J("tabindex"),f(Ke,8))},a.\u0275cmp=F({type:a,selectors:[["mat-button-toggle"]],viewQuery:function(n,i){if(n&1&&$(st,5),n&2){let d;D(d=B())&&(i._buttonElement=d.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:12,hostBindings:function(n,i){n&1&&g("focus",function(){return i.focus()}),n&2&&(S("aria-label",null)("aria-labelledby",null)("id",i.id)("name",null),R("mat-button-toggle-standalone",!i.buttonToggleGroup)("mat-button-toggle-checked",i.checked)("mat-button-toggle-disabled",i.disabled)("mat-button-toggle-appearance-standard",i.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",w],appearance:"appearance",checked:[2,"checked","checked",w],disabled:[2,"disabled","disabled",w]},outputs:{change:"change"},exportAs:["matButtonToggle"],standalone:!0,features:[W,L],ngContentSelectors:mt,decls:8,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-label-content"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"]],template:function(n,i){if(n&1){let d=M();G(),r(0,"button",1,0),g("click",function(){return x(d),v(i._onButtonClick())}),r(2,"span",2),C(3,ut,1,1,"mat-pseudo-checkbox",3)(4,pt,1,1,"mat-pseudo-checkbox",3),q(5),l()(),I(6,"span",4)(7,"span",5)}if(n&2){let d=P(1);p("id",i.buttonId)("disabled",i.disabled||null),S("role",i.isSingleSelector()?"radio":"button")("tabindex",i.disabled?-1:i.tabIndex)("aria-pressed",i.isSingleSelector()?null:i.checked)("aria-checked",i.isSingleSelector()?i.checked:null)("name",i._getButtonName())("aria-label",i.ariaLabel)("aria-labelledby",i.ariaLabelledby),m(3),A(i.buttonToggleGroup&&i.checked&&!i.buttonToggleGroup.multiple&&!i.buttonToggleGroup.hideSingleSelectionIndicator?3:-1),m(),A(i.buttonToggleGroup&&i.checked&&i.buttonToggleGroup.multiple&&!i.buttonToggleGroup.hideMultipleSelectionIndicator?4:-1),m(3),p("matRippleTrigger",d)("matRippleDisabled",i.disableRipple||i.disabled)}},dependencies:[ee,Le],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)}.cdk-high-contrast-active .mat-button-toggle-standalone,.cdk-high-contrast-active .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);border:solid 1px var(--mat-standard-button-toggle-divider-color)}.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 )}.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}.cdk-high-contrast-active .mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.cdk-high-contrast-active .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 .mat-pseudo-checkbox{margin-right:12px}[dir=rtl] .mat-button-toggle .mat-pseudo-checkbox{margin-right:0;margin-left:12px}.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{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-appearance-standard{color:var(--mat-standard-button-toggle-text-color);background-color:var(--mat-standard-button-toggle-background-color);font-family:var(--mat-standard-button-toggle-label-text-font);font-size:var(--mat-standard-button-toggle-label-text-size);line-height:var(--mat-standard-button-toggle-label-text-line-height);font-weight:var(--mat-standard-button-toggle-label-text-weight);letter-spacing:var(--mat-standard-button-toggle-label-text-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)}[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)}.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)}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-selected-state-text-color);background-color:var(--mat-standard-button-toggle-selected-state-background-color)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-standard-button-toggle-disabled-state-text-color);background-color:var(--mat-standard-button-toggle-disabled-state-background-color)}.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 )}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-disabled-selected-state-text-color);background-color:var(--mat-standard-button-toggle-disabled-selected-state-background-color)}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-standard-button-toggle-state-layer-color)}.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-hover-state-layer-opacity)}.mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-focus-state-layer-opacity)}@media(hover: none){.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):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)}.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)}.cdk-high-contrast-active .mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.cdk-high-contrast-active .mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.cdk-high-contrast-active .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-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius:var(--mat-standard-button-toggle-shape)}.mat-button-toggle-group-appearance-standard .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape);border-bottom-right-radius:var(--mat-standard-button-toggle-shape)}.mat-button-toggle-group-appearance-standard .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-standard-button-toggle-shape);border-bottom-left-radius:var(--mat-standard-button-toggle-shape)}"],encapsulation:2,changeDetection:0});let o=a;return o})(),tt=(()=>{let a=class a{};a.\u0275fac=function(n){return new(n||a)},a.\u0275mod=k({type:a}),a.\u0275inj=y({imports:[b,Be,me,b]});let o=a;return o})();function bt(o,a){if(o&1){let s=M();r(0,"li")(1,"button",14),g("click",function(){let n=x(s).$implicit,i=O(2);return i.from=n,v(i.showUpdatePath())}),r(2,"span"),u(3),l()()()}if(o&2){let s=a.$implicit;m(3),Y(s.name)}}function xt(o,a){if(o&1&&(r(0,"ul",13),V(1,bt,4,1,"li",null,H),l()),o&2){let s=O();m(),U(s.versions)}}function vt(o,a){if(o&1){let s=M();r(0,"li")(1,"button",14),g("click",function(){let n=x(s).$implicit,i=O(2);return i.to=n,v(i.showUpdatePath())}),r(2,"span"),u(3),l()()()}if(o&2){let s=a.$implicit;m(3),Y(s.name)}}function _t(o,a){if(o&1&&(r(0,"ul",13),V(1,vt,4,1,"li",null,H),l()),o&2){let s=O();m(),U(s.versions)}}function yt(o,a){o&1&&(r(0,"div",8)(1,"p")(2,"strong"),u(3,"\u8B66\u544A\uFF1A"),l(),u(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 "),l()())}function kt(o,a){o&1&&(r(0,"div",8)(1,"p")(2,"strong"),u(3,"\u8B66\u544A\uFF1A"),l(),u(4," \u6211\u4EEC\u4E0D\u652F\u6301\u964D\u7EA7 Angular \u7248\u672C\u3002 "),l()())}function At(o,a){o&1&&(r(0,"div",8)(1,"p")(2,"strong"),u(3,"\u8B66\u544A\uFF1A"),l(),u(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 "),r(5,"code"),u(6,"ng update"),l(),u(7," \u65F6\u4E0D\u5E94\u8BE5\u8DF3\u8FC7\u4EFB\u4F55\u4E3B\u8981\u7248\u672C\u6765\u66F4\u65B0 Angular \u5E94\u7528\u7A0B\u5E8F\u3002 "),l()())}function It(o,a){o&1&&(r(0,"p"),u(1,"\u5C55\u793A\u6240\u6709 Angular \u5F00\u53D1\u8005\u90FD\u611F\u5174\u8DA3\u7684\u4FE1\u606F\u3002"),l())}function wt(o,a){o&1&&(r(0,"p"),u(1,"\u5C55\u793A\u66F4\u9AD8\u7EA7 Angular \u5F00\u53D1\u8005\u4F1A\u611F\u5174\u8DA3\u7684\u4FE1\u606F\u3002"),l())}function Ct(o,a){o&1&&(r(0,"p"),u(1,"\u5C55\u793A\u5173\u4E8E\u8FD9\u4E2A\u66F4\u65B0\u7684\u6240\u6709\u4FE1\u606F\u3002"),l())}function Ot(o,a){if(o&1){let s=M();r(0,"p")(1,"mat-checkbox",15),g("change",function(n){let i=x(s).$implicit,d=O();return d.options[i.id]=n.checked,v(d.showUpdatePath())}),u(2),l()()}if(o&2){let s=a.$implicit,t=O();m(),p("checked",t.options[s.id]),m(),Ce("I use ",s.name," ",s.description,"")}}function Et(o,a){if(o&1){let s=M();r(0,"h4"),u(1,"\u5305\u7BA1\u7406\u5668"),l(),r(2,"mat-button-toggle-group",16),g("change",function(n){x(s);let i=O();return i.packageManager=n.value,v(i.showUpdatePath())}),r(3,"mat-button-toggle",17),u(4,"npm"),l(),r(5,"mat-button-toggle",18),u(6,"yarn"),l()()}if(o&2){let s=O();m(2),p("value",s.packageManager)}}function St(o,a){if(o&1&&(r(0,"div",19),I(1,"mat-checkbox")(2,"div",20),l()),o&2){let s=a.$implicit;m(2),p("innerHTML",s.renderedStep,ne)}}function Mt(o,a){o&1&&(r(0,"div")(1,"em"),u(2,"\u5728\u8FD9\u4E9B\u7248\u672C\u4E4B\u95F4\u5207\u6362\u4E4B\u524D\uFF0C\u4F60\u65E0\u9700\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002"),l()())}function Ft(o,a){o&1&&(r(0,"div")(1,"em"),u(2,"\u8BF7\u5BA1\u6838\u8FD9\u4E9B\u66F4\u6539\u5E76\u6267\u884C\u8FD9\u4E9B\u64CD\u4F5C\u6765\u66F4\u65B0\u5E94\u7528\u7A0B\u5E8F\u3002"),l()())}function Tt(o,a){if(o&1&&(r(0,"div",19),I(1,"mat-checkbox")(2,"div",20),l()),o&2){let s=a.$implicit;m(2),p("innerHTML",s.renderedStep,ne)}}function Rt(o,a){o&1&&(r(0,"div")(1,"em"),u(2,"\u5BF9\u8FD9\u4E9B\u7248\u672C\u4E4B\u95F4\u7684\u79FB\u52A8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u5EFA\u8BAE\u3002"),l()())}function Dt(o,a){if(o&1&&(r(0,"div",19),I(1,"mat-checkbox")(2,"div",20),l()),o&2){let s=a.$implicit;m(2),p("innerHTML",s.renderedStep,ne)}}function Bt(o,a){o&1&&(r(0,"div")(1,"em"),u(2,"\u5728\u5207\u6362\u8FD9\u4E9B\u7248\u672C\u4E4B\u540E\uFF0C\u4F60\u65E0\u9700\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002"),l()())}function Lt(o,a){if(o&1&&(r(0,"div",12)(1,"h2"),u(2),l(),r(3,"h3"),u(4,"\u5728\u66F4\u65B0\u4E4B\u524D"),l(),V(5,St,3,1,"div",19,H),C(7,Mt,3,0,"div"),r(8,"h3"),u(9,"\u66F4\u65B0\u5230\u65B0\u7248\u672C"),l(),C(10,Ft,3,0,"div"),V(11,Tt,3,1,"div",19,H),C(13,Rt,3,0,"div"),r(14,"h3"),u(15,"\u66F4\u65B0\u4E4B\u540E"),l(),V(16,Dt,3,1,"div",19,H),C(18,Bt,3,0,"div"),l()),o&2){let s=O();m(2),Y(s.title),m(3),U(s.beforeRecommendations),m(2),A(s.beforeRecommendations.length<=0?7:-1),m(3),A(s.duringRecommendations.length>0?10:-1),m(),U(s.duringRecommendations),m(2),A(s.duringRecommendations.length<=0?13:-1),m(3),U(s.afterRecommendations),m(2),A(s.afterRecommendations.length<=0?18:-1)}}var mn=(()=>{let a=class a{constructor(){this.title="",this.level=1,this.options={ngUpgrade:!1,material:!1,windows:zt()},this.optionList=[{id:"ngUpgrade",name:"ngUpgrade",description:"\u5408\u5E76 AngularJS \u4E0E Angular"},{id:"material",name:"Angular Material",description:""},{id:"windows",name:"Windows",description:""}],this.packageManager="npm install",this.beforeRecommendations=[],this.duringRecommendations=[],this.afterRecommendations=[],this.versions=[{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}],this.from=this.versions.find(i=>i.name==="17.0"),this.to=this.versions.find(i=>i.name==="18.0"),this.futureVersion=1900,this.steps=Ue,this.clipboard=ie(Ge),this.router=ie(Se),this.activatedRoute=ie(Ee);let t=this.activatedRoute.snapshot.queryParamMap;this.level=parseInt(t.get("l"),10)||this.level;let n=t.get("v");if(n){let[i,d]=n.split("-");this.from=this.versions.find(c=>c.name===i),this.to=this.versions.find(c=>c.name===d),this.showUpdatePath()}}copyCode({tagName:t,textContent:n}){t==="CODE"&&this.clipboard.copy(n)}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",n="\u57FA\u7840\u5E94\u7528",i="\u4E2D\u7B49\u5E94\u7528",d="\u9AD8\u7EA7\u5E94\u7528";this.title=`${t} v${this.from.name} -> v${this.to.name}
for
${this.level<2?n:this.level<3?i:d}`;for(let c of this.steps)if(c.level<=this.level&&c.necessaryAsOf>this.from.number){let h=!1;for(let E of this.optionList)c[E.id]&&!this.options[E.id]&&(h=!0),c[E.id]===!1&&this.options[E.id]&&(h=!0);if(h)continue;c.renderedStep=await be(this.replaceVariables(c.action)),c.possibleIn<=this.from.number&&c.necessaryAsOf>=this.from.number?this.beforeRecommendations.push(c):c.possibleIn>this.from.number&&c.necessaryAsOf<=this.to.number?this.duringRecommendations.push(c):c.possibleIn<=this.to.number&&this.afterRecommendations.push(c)}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 n=Math.floor(t/100),i=Math.floor((t-n*100)/10);return`^${n}.${i}.0`}}async renderPreV6Instructions(){let t,n=/win/i.test(navigator.platform),i=this.getAdditionalDependencies(this.to.number),d=this.getAngularVersion(this.to.number),c=["animations","common","compiler","compiler-cli","core","forms","http","platform-browser","platform-browser-dynamic","platform-server","router"];if(this.to.number<600){let h="\u5C06\u6240\u6709\u4F9D\u8D56\u9879\u66F4\u65B0\u5230\u6700\u65B0\u7684 Angular \u548C\u6B63\u786E\u7248\u672C\u7684 TypeScript\u3002";if(n){let E=c.map(it=>`@angular/${it}@${d}`).join(" ")+" "+i;t={step:"\u4E00\u822C\u66F4\u65B0",action:`${h}
\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Windows\uFF0C\u5219\u53EF\u4EE5\u7528\uFF1A
\`${this.packageManager} ${E}\``}}else{let E=`@angular/{${c.join(",")}}@${d} ${i}`;t={step:"\u4E00\u822C\u66F4\u65B0",action:`${h}
\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Linux/Mac\uFF0C\u5219\u53EF\u4EE5\u7528\uFF1A
\`${this.packageManager} ${E}\``}}this.packageManager==="npm install"&&this.to.number===500&&(t.action+="\n\n`npm install [email protected] --save-exact`"),t.renderedStep=await be(t.action),this.duringRecommendations.push(t)}}replaceVariables(t){let n=t;return n=n.replace("${packageManagerGlobalInstall}",this.packageManager==="npm install"?"npm install -g":"yarn global add"),n=n.replace("${packageManagerInstall}",this.packageManager),n}};a.\u0275fac=function(n){return new(n||a)},a.\u0275cmp=F({type:a,selectors:[["adev-update-guide"]],hostBindings:function(n,i){n&1&&g("click",function(c){return i.copyCode(c.target)})},standalone:!0,features:[L],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(n,i){if(n&1){let d=M();r(0,"div",2)(1,"h1",3),u(2,"\u66F4\u65B0\u6307\u5357"),l(),r(3,"div",4)(4,"div")(5,"h2"),u(6,"\u9009\u62E9\u4E0E\u4F60\u7684\u66F4\u65B0\u76F8\u5339\u914D\u7684\u9009\u9879"),l(),r(7,"h3"),u(8,"Angular \u7248\u672C"),l(),r(9,"div",5)(10,"span",6),u(11," \u4ECE v. "),r(12,"button",7)(13,"span"),u(14),l(),r(15,"docs-icon"),u(16,"expand_more"),l()(),C(17,xt,3,0,"ng-template",null,0,re),l(),r(19,"span")(20,"span",6),u(21," \u5230 v. "),r(22,"button",7)(23,"span"),u(24),l(),r(25,"docs-icon"),u(26,"expand_more"),l()(),C(27,_t,3,0,"ng-template",null,1,re),l()()(),C(29,yt,5,0,"div",8)(30,kt,5,0,"div",8)(31,At,8,0,"div",8),r(32,"h3"),u(33,"\u5E94\u7528\u7A0B\u5E8F\u590D\u6742\u6027"),l(),r(34,"mat-button-toggle-group",9),g("change",function(h){return x(d),v(i.level=h.value)}),r(35,"mat-button-toggle",10),u(36,"\u57FA\u7840"),l(),r(37,"mat-button-toggle",10),u(38,"\u4E2D\u7B49"),l(),r(39,"mat-button-toggle",10),u(40,"\u9AD8\u7EA7"),l()(),C(41,It,2,0,"p")(42,wt,2,0,"p")(43,Ct,2,0,"p"),r(44,"h3"),u(45,"Other dependencies"),l(),V(46,Ot,3,3,"p",null,H),C(48,Et,7,1),r(49,"button",11),g("click",function(){return x(d),v(i.showUpdatePath())}),u(50," \u544A\u8BC9\u6211\u5982\u4F55\u66F4\u65B0 "),l()()(),I(51,"hr"),C(52,Lt,19,5,"div",12),l()}if(n&2){let d=P(18),c=P(28);m(12),p("cdkMenuTriggerFor",d),m(2),Y(i.from.name),m(8),p("cdkMenuTriggerFor",c),m(2),Y(i.to.name),m(5),A(i.from.number>=i.futureVersion||i.to.number>=i.futureVersion?29:-1),m(),A(i.from.number>i.to.number?30:-1),m(),A(i.to.number-i.from.number>150&&i.from.number>240?31:-1),m(3),p("value",i.level),m(),p("value",1),m(2),p("value",2),m(2),p("value",3),m(2),A(i.level===1?41:i.level===2?42:i.level===3?43:-1),m(5),U(i.optionList),m(2),A(i.from.number<600?48:-1),m(),S("text","\u544A\u8BC9\u6211\u5982\u4F55\u66F4\u65B0\uFF01"),m(3),A(i.beforeRecommendations.length>0||i.duringRecommendations.length>0||i.afterRecommendations.length>0?52:-1)}},dependencies:[Ye,ce,Xe,We,Ze,tt,ye,me,Ve,He,je,Ne,Fe],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});let o=a;return o})();function zt(){let o=navigator.platform.toLowerCase();return o.includes("windows")||o.includes("win32")}export{mn as default};