Angular 力圖兼顧創(chuàng)新與穩(wěn)定。但有時(shí),API 和特性已經(jīng)過(guò)時(shí),需要進(jìn)行刪除或替換,以便 Angular 可以及時(shí)跟上新的最佳實(shí)踐、依賴(lài)項(xiàng)變更或者 Web 平臺(tái)自身的變化。
為了使這些轉(zhuǎn)換盡可能容易,我們?cè)趧h除這些 API 和特性之前會(huì)棄用它們一段時(shí)間。這讓你有時(shí)間將應(yīng)用程序更新為最新的 API 和最佳實(shí)踐。
本指南包含了當(dāng)前已棄用的所有 Angular API 和特性的匯總表。
為幫助你的項(xiàng)目面向未來(lái),下表列出了所有已棄用的 API 和特性,并按它們將被移除的候選版本進(jìn)行組織。每個(gè)項(xiàng)目都鏈接到本指南后面描述棄用原因和替換選項(xiàng)的部分。
特性區(qū) |
API 或特性 |
將移除于 |
---|---|---|
@angular/common
|
?
|
v11 |
@angular/common
|
?CurrencyPipe ?- ?DEFAULT_CURRENCY_CODE ? |
v11 |
@angular/common/http
|
?XhrFactory ? |
v15 |
@angular/common/http/testing
|
|
v16 |
@angular/core
|
?DefaultIterableDiffer ? |
v11 |
@angular/core
|
?ReflectiveKey ? |
v11 |
@angular/core
|
?RenderComponentType ? |
v11 |
@angular/core
|
? |
v15 |
@angular/core
|
?PlatformRef.bootstrapModuleFactory ? |
v15 |
@angular/core
|
?getModuleFactory ? |
v16 |
@angular/core
|
?ModuleWithComponentFactories ? |
v16 |
@angular/core
|
?Compiler ? |
v16 |
@angular/core
|
?CompilerFactory ? |
v16 |
@angular/core
|
?NgModuleFactory ? |
v16 |
@angular/platform-browser-dynamic
|
?
|
v16 |
@angular/forms
|
和響應(yīng)式表單一起使用 ? |
v11 |
@angular/upgrade
|
?
|
v11 |
@angular/upgrade
|
?
|
v11 |
@angular/upgrade
|
?
|
v11 |
@angular/upgrade
|
? |
v15 |
模板語(yǔ)法 |
?
|
v11 |
膩?zhàn)幽_本 |
?reflect-metadata ? |
v11 |
@angular/compiler-cli
|
? |
v15 |
@angular/compiler-cli
|
?fullTemplateTypeCheck ? |
v15 |
@angular/core
|
?defineInjectable ? |
v11 |
@angular/core
|
?entryComponents ? |
v11 |
@angular/core
|
?ANALYZE_FOR_ENTRY_COMPONENTS ? |
v11 |
@angular/core
|
? |
v15 |
@angular/core/testing
|
?TestBed.get ? |
v12 |
@angular/core/testing
|
?async ? |
v12 |
@angular/core/testing
|
? |
v14 |
@angular/core/testing
|
? |
v14 |
@angular/forms
|
? |
v14 |
@angular/platform-server
|
?renderModuleFactory ? |
v15 |
@angular/service-worker
|
?SwUpdate#activated ? |
v16 |
@angular/service-worker
|
?SwUpdate#available ? |
v16 |
模板語(yǔ)法 |
? |
未指定 |
模板語(yǔ)法 |
? |
v15 |
要了解 Angular CDK 和 Angular Material 的棄用情況,參閱變更記錄。
本節(jié)包含所有當(dāng)前已棄用的 API 的完整列表,其中包含一些可幫助你規(guī)劃如何遷移到其替代品的詳細(xì)信息。
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?CurrencyPipe ?- ?DEFAULT_CURRENCY_CODE ? |
{provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}
|
v9 |
從 v11 開(kāi)始,默認(rèn)代碼將從 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?XhrFactory ? |
|
v12 |
|
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?DefaultIterableDiffer ? |
n/a | v4 |
不再是公共 API。 |
?ReflectiveInjector ? |
Injector.create()
|
v5 |
參見(jiàn)下文的 ? |
?ReflectiveKey ? |
無(wú) |
v5 |
無(wú) |
?defineInjectable ? |
??defineInjectable
|
v8 |
僅在生成的代碼中使用。任何源代碼都不應(yīng)依賴(lài)此 API。 |
?entryComponents ? |
無(wú) |
v9 |
參見(jiàn)下文的 ? |
?ANALYZE_FOR_ENTRY_COMPONENTS ? |
無(wú) |
v9 |
參見(jiàn)下文的 ? |
?async ? |
?waitForAsync ? |
v11 |
來(lái)自 |
?getModuleFactory ? |
?getNgModuleById ? |
v13 |
Ivy 允許直接使用 NgModule 類(lèi),而無(wú)需檢索相應(yīng)的工廠。 |
ViewChildren.emitDistinctChangesOnly / ContentChildren.emitDistinctChangesOnly
|
無(wú)(是問(wèn)題 #40091的一部分) |
這是作為問(wèn)題 #40091的錯(cuò)誤修復(fù)的一部分引入的臨時(shí)標(biāo)志,將被刪除。 |
|
? |
? |
v13 |
有了 ivy,不需要解析 Component factory,直接提供 Component Type 即可。 |
?PlatformRef.bootstrapModuleFactory
? |
?PlatformRef.bootstrapModule ? |
v13 |
有了 ivy,就不需要解析 NgModule factory,直接提供 NgModule Type 即可。 |
?ModuleWithComponentFactories
? |
無(wú) |
v13 |
Ivy JIT 模式不需要訪(fǎng)問(wèn)這個(gè)符號(hào)。 |
?Compiler ? |
無(wú) |
v13 |
Ivy JIT 模式不需要訪(fǎng)問(wèn)這個(gè)符號(hào)。 |
?CompilerFactory ? |
無(wú) |
v13 |
Ivy JIT 模式不需要訪(fǎng)問(wèn)這個(gè)符號(hào)。 |
?NgModuleFactory ? |
使用基于非工廠的框架 API,如 |
v13 |
Ivy JIT 模式不需要訪(fǎng)問(wèn)這個(gè)符號(hào)。 |
? |
? |
v13 |
Angular 不再需要組件工廠來(lái)動(dòng)態(tài)創(chuàng)建組件。使用 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?TestBed.get ? |
?TestBed.inject ? |
v9 |
行為沒(méi)變,但類(lèi)型安全。 |
?async ? |
?waitForAsync ? |
v10 |
行為相同,只是改名以免混淆。 |
? |
無(wú)需更換 |
v13 |
Ivy 中不使用摘要文件。 |
? |
無(wú)需更換 |
v13 |
Ivy 中未使用摘要文件。 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?
|
無(wú) |
v13 |
不再需要此符號(hào)。 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?renderModuleFactory ? |
?renderModule ? |
v13 |
不再需要此符號(hào)。 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
? |
?FormControlDirective ? |
v6 |
無(wú) |
? |
? |
v11 |
無(wú) |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?SwUpdate#activated ? |
? |
v13 |
|
?SwUpdate#available ? |
?SwUpdate#versionUpdates ? |
v13 |
|
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
所有入口點(diǎn) |
?@angular/upgrade/static ? |
v5 |
API |
替代品 |
聲明棄用于 |
備注 |
---|---|---|---|
?getAngularLib ? |
?getAngularJSGlobal ? |
v5 | |
?setAngularLib ? |
?setAngularJSGlobal ? |
v5 | |
? |
? |
v13 |
|
本部分列出了所有當(dāng)前已棄用的特性,其中包括模板語(yǔ)法、配置選項(xiàng)以及上述已棄用 API部分中未列出的任何其他棄用特性。它還包括已棄用的 API 使用場(chǎng)景或 API 組合,以作為上述信息的補(bǔ)充。
Angular Labs 中引入了 Bazel 構(gòu)建器和原理圖,讓用戶(hù)無(wú)需管理 Bazel 版本和 BUILD 文件即可試用 Bazel。此特性已被棄用。
Angular 以前支持與Web 跟蹤框架 (WTF)集成,以對(duì) Angular 應(yīng)用程序進(jìn)行性能測(cè)試。此集成未經(jīng)維護(hù),現(xiàn)已失效。因此,該集成在 Angular 版本 8 中被棄用,并且由于沒(méi)有任何現(xiàn)有使用的證據(jù),因此在版本 9 中被刪除。
這類(lèi) shadow-dom-piercing 后代組合器已棄用,并且正在從主要瀏覽器和工具中刪除支持。因此,在 v4 中,我們棄用了 Angular 對(duì) ?/deep/
? 、 ?>>>
? 和 ?::ng-deep
? 三個(gè)的支持。在正式移除之前, ?::ng-deep
? 是首選,因?yàn)樗c工具具有更廣泛的兼容性。
模板前綴 ?bind-
? 、 ?on-
? 、 ?bindon-
? 和 ?ref-
? 在 v13 中已被棄用。模板應(yīng)該使用更廣為人知的語(yǔ)法進(jìn)行綁定和引用:
[input]="value"
? 代替 ?bind-input="value"
?[@trigger]="value"
? 代替 ?bind-animate-trigger="value"
?(click)="onClick()"
? 代替 ?on-click="onClick()"
?[(ngModel)]="value"
? 代替 ?bindon-ngModel="value"
?#templateRef
? 代替 ?ref-templateRef
??<template>
? 標(biāo)簽在 v4 中已被棄用,以避免與 DOM 的同名元素發(fā)生沖突(例如在使用 Web 組件時(shí))。使用 ?<ng-template>
? 代替。
在 Angular v6 中已不推薦把 ?ngModel
?輸入屬性、?ngModelChange
?事件與響應(yīng)式表單指令一起使用,并將在 Angular 的未來(lái)版本中刪除。
現(xiàn)在已經(jīng)棄用:
<input [formControl]="control" [(ngModel)]="value">
this.value = 'some value';
出于多種原因,此支持已被棄用。首先,開(kāi)發(fā)人員發(fā)現(xiàn)這種模式令人困惑。似乎正在使用實(shí)際的 ?ngModel
?指令,但實(shí)際上它是響應(yīng)式表單指令上名為 ?ngModel
?的輸入/輸出屬性,它模擬了該指令的一些行為,但又不完全一樣。它允許獲取和設(shè)置值并攔截值事件,但 ?ngModel
?的一些其他特性,例如使用 ?ngModelOptions
?延遲更新或?qū)С鲋噶?,不起作用?/p>
另外,該模式混用了模板驅(qū)動(dòng)和響應(yīng)式這兩種表單策略,這會(huì)妨礙我們獲取任何一種策略的全部?jī)?yōu)點(diǎn)。 在模板中設(shè)置值的方式,也違反了響應(yīng)式表單所遵循的“模板無(wú)關(guān)”原則;反之,在類(lèi)中添加 ?FormControl
?/?FormGroup
?層也破壞了“在模板中定義表單”的約定。
要在移除支持之前更新你的代碼。你需要決定是堅(jiān)持使用響應(yīng)式表單指令(并使用響應(yīng)式表單模式來(lái)獲取/設(shè)置值)還是切換到模板驅(qū)動(dòng)表單指令。
之后(選擇 1 - 使用響應(yīng)式表單):
<input [formControl]="control">
this.control.setValue('some value');
之后(選擇 2 - 使用模板驅(qū)動(dòng)表單):
<input [(ngModel)]="value">
this.value = 'some value';
默認(rèn)情況下,當(dāng)你使用此模式時(shí),你將在開(kāi)發(fā)模式下看到一次棄用警告。你可以通過(guò)在導(dǎo)入時(shí)配置 ?ReactiveFormsModule
?來(lái)選擇消除此警告:
imports: [
ReactiveFormsModule.withConfig({warnOnNgModelWithFormControl: 'never'})
],
或者,你可以選擇為該模式的每個(gè)實(shí)例顯示一個(gè)單獨(dú)的警告,配置值為 ?"always"
? 。這可能有助于在更新代碼時(shí)跟蹤代碼中使用模式的位置。
在 v5 中,Angular 用 ?StaticInjector
?代替了 ?ReflectiveInjector
?。該注入器不再需要 Reflect 的膩?zhàn)幽_本,對(duì)大部分開(kāi)發(fā)人員來(lái)說(shuō)都顯著減小了應(yīng)用的體積。
之前:
ReflectiveInjector.resolveAndCreate(providers);
之后:
Injector.create({providers});
當(dāng) Angular 第一次引入惰性路由時(shí),還沒(méi)有瀏覽器能支持動(dòng)態(tài)加載額外的 JavaScript。因此 Angular 創(chuàng)建了自己的方案,所用的語(yǔ)法是 ?loadChildren: './lazy/lazy.module#LazyModule'
? 并且還構(gòu)建了一些工具來(lái)支持它?,F(xiàn)在,很多瀏覽器都已支持 ECMAScript 的動(dòng)態(tài)導(dǎo)入,Angular 也正朝著這個(gè)新語(yǔ)法前進(jìn)。
在版本 8 中,不推薦使用 ?loadChildren
?路由規(guī)范的字符串語(yǔ)法,而是改用基于 ?import()
? 的新語(yǔ)法。
之前:
const routes: Routes = [{
path: 'lazy',
// The following string syntax for loadChildren is deprecated
loadChildren: './lazy/lazy.module#LazyModule',
}];
之后:
const routes: Routes = [{
path: 'lazy',
// The new import() syntax
loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)
}];
版本 8 更新:當(dāng)你更新到版本 8 時(shí), ?ng update
? 命令會(huì)自動(dòng)執(zhí)行轉(zhuǎn)換。在版本 7 之前, ?import()
? 語(yǔ)法僅適用于 JIT 模式(使用視圖引擎)。
聲明語(yǔ)法:遵循路由聲明語(yǔ)法 ?
loadChildren: () => import('...').then(m => m.ModuleName)
? 很重要,這樣 ?ngc
?才能發(fā)現(xiàn)惰性加載的模塊和關(guān)聯(lián)的 ?NgModule
?。你可以在此處找到允許的語(yǔ)法結(jié)構(gòu)的完整列表。這些限制將隨著 Ivy 的發(fā)布而放寬,因?yàn)樗鼘⒉辉偈褂?nbsp;?NgFactories
?。
Angular 應(yīng)用程序,特別是依賴(lài)于 JIT 編譯器的應(yīng)用程序,過(guò)去常常需要 reflect-metadata API 的膩?zhàn)幽_本。
在 Angular 8.0 版(見(jiàn)#14473 )中移除了對(duì)這個(gè)膩?zhàn)幽_本的需求,這將使得大多數(shù) Angular 應(yīng)用程序不再需要此膩?zhàn)幽_本。因?yàn)榇四佔(zhàn)幽_本可能被第三方庫(kù)依賴(lài),因此不能從所有 Angular 項(xiàng)目中刪除它,我們從 8.0 版本開(kāi)始棄用對(duì)這個(gè)膩?zhàn)幽_本的要求。這樣可以給庫(kù)作者和應(yīng)用程序開(kāi)發(fā)人員足夠的時(shí)間來(lái)評(píng)估他們是否需要此膩?zhàn)幽_本,并執(zhí)行任何必要的重構(gòu)以消除對(duì)它的依賴(lài)。
在典型的 Angular 項(xiàng)目中,這個(gè)膩?zhàn)幽_本不用于生產(chǎn)版本,因此刪除它不會(huì)影響生產(chǎn)環(huán)境的應(yīng)用程序。刪除它是為了從整體上上簡(jiǎn)化構(gòu)建設(shè)置并減少外部依賴(lài)項(xiàng)的數(shù)量。
在版本 9 中,?@ViewChild
? 和 ?@ContentChild
? 這兩個(gè)查詢(xún)的默認(rèn)設(shè)置會(huì)改變,以修復(fù)查詢(xún)中的 BUG 和意外行為。
為了應(yīng)對(duì)這個(gè)變化,我們從版本 8 開(kāi)始就要開(kāi)始遷移所有應(yīng)用和庫(kù),顯式指定 ?@ViewChild
? 和 ?@ContentChild
? 查詢(xún)的解析策略。
具體來(lái)說(shuō),這次遷移會(huì)添加一個(gè)顯式的 “static” 標(biāo)志,用來(lái)指出應(yīng)該何時(shí)對(duì)該查詢(xún)的結(jié)果進(jìn)行賦值。等升級(jí)到版本 9 的時(shí)候,這個(gè)標(biāo)志可以確保這些代碼的工作方式都是一樣的。
之前:
// query results sometimes available in `ngOnInit`, sometimes in `ngAfterViewInit` (based on template)
@ViewChild('foo') foo: ElementRef;
之后:
// query results available in ngOnInit
@ViewChild('foo', {static: true}) foo: ElementRef;
OR
// query results available in ngAfterViewInit
@ViewChild('foo', {static: false}) foo: ElementRef;
從版本 9 開(kāi)始,?static
?標(biāo)志將默認(rèn)為 ?false
?。那時(shí)候,可以安全地刪除所有 ?{static: false}
? 標(biāo)志,而且我們還會(huì)提供一個(gè)能幫你更新代碼的原理圖(schematic)。
注意:這個(gè)標(biāo)志只適用于 ?@ViewChild
? 和 ?@ContentChild
? 這兩個(gè)查詢(xún),這是因?yàn)?nbsp;?@ViewChildren
? 和 ?@ContentChildren
? 查詢(xún)都沒(méi)有靜態(tài)和動(dòng)態(tài)的概念(它們總是“動(dòng)態(tài)”解析)。
以下模式已棄用:
@Input() @ContentChild(TemplateRef) tpldeprecated !: TemplateRef<any>;
不要再使用此模式,而應(yīng)該將這兩個(gè)裝飾器分離到它們各自的屬性中并添加回退邏輯,如下例所示:
@Input() tpl !: TemplateRef<any>;
@ContentChild(TemplateRef) inlineTemplate !: TemplateRef<any>;
在以下示例中,雙向綁定意味著應(yīng)在 ?valueChange
?事件觸發(fā)時(shí)寫(xiě)入 ?optionName
?。
<option *ngFor="let optionName of options" [(value)]="optionName"></option>
然而,在實(shí)踐中,Angular 忽略了對(duì)模板變量的雙向綁定。從版本 8 開(kāi)始,不推薦對(duì)模板變量賦值。在未來(lái)的版本中,我們將拋出錯(cuò)誤以指出不支持寫(xiě)入。
<option *ngFor="let optionName of options" [value]="optionName"></option>
在服務(wù)器端渲染中使用的 Domino 不支持 ?innerText
?,因此在平臺(tái)服務(wù)器中的 “domino 適配器”中,如果嘗試綁定到 ?innerText
?,則有一些特殊代碼可以退回到 ?textContent
?。
這兩個(gè)屬性有細(xì)微的差別,因此在幕后切換到 ?textContent
?可能會(huì)讓用戶(hù)感到驚訝。出于這個(gè)原因,我們棄用了這種行為。展望未來(lái),用戶(hù)應(yīng)該在使用 Domino 時(shí)顯式綁定到 ?textContent
?。
所有 ?wtf*
? API 均已棄用,并將在未來(lái)版本中刪除。
以前, ?NgModule
?定義中的 ?entryComponents
?數(shù)組用于告訴編譯器將動(dòng)態(tài)創(chuàng)建和插入哪些組件。使用 Ivy 后,這不再是必需的,并且可以從現(xiàn)有模塊聲明中刪除 ?entryComponents
?數(shù)組。這同樣適用于 ?ANALYZE_FOR_ENTRY_COMPONENTS
?注入令牌。
注意:如果構(gòu)建將由 View Engine 應(yīng)用程序使用的庫(kù),你可能仍需要保留它們。
一些 Angular 庫(kù),例如 ?@angular/router
? 和 ?@ngrx/store
? ,實(shí)現(xiàn)的 API 返回名為 ModuleWithProviders 的類(lèi)型(通常使用名為 ?ModuleWithProviders
??forRoot()
? 的方法)。這種類(lèi)型代表一個(gè) ?NgModule
?以及其他提供者。 Angular 版本 9 已棄用沒(méi)有明確泛型類(lèi)型的 ?NgModule
??ModuleWithProviders
?類(lèi)型。在 Angular 的未來(lái)版本中,泛型將不再是可選的。
如果你使用的是 CLI,則 ?ng update
? 應(yīng)該會(huì)自動(dòng)遷移代碼。如果沒(méi)有使用 CLI,則可以將任何缺失的泛型類(lèi)型手動(dòng)添加到應(yīng)用程序中。例如:
之前
@NgModule({
/* ... */
})
export class MyModule {
static forRoot(config: SomeConfig): ModuleWithProviders {
return {
ngModule: SomeModule,
providers: [
{provide: SomeConfig, useValue: config}
]
};
}
}
之后:
@NgModule({
/* ... */
})
export class MyModule {
static forRoot(config: SomeConfig): ModuleWithProviders<SomeModule> {
return {
ngModule: SomeModule,
providers: [
{provide: SomeConfig, useValue: config}
]
};
}
}
由于在 Angular 中引入了 ?strictTemplates
?標(biāo)志,編譯器已經(jīng)能夠根據(jù)相應(yīng)指令的聲明輸入類(lèi)型對(duì)輸入綁定進(jìn)行類(lèi)型檢查。當(dāng) “getter/setter 對(duì)”用于輸入時(shí),可能需要讓 setter 接受比 getter 返回的類(lèi)型更寬泛的類(lèi)型集,例如當(dāng) setter 首次轉(zhuǎn)換輸入值時(shí)。然而,在 TypeScript 4.3 之前,需要 getter/setter 對(duì)具有相同的類(lèi)型,因此無(wú)法準(zhǔn)確地聲明此模式。
為了減輕這種限制,可以在對(duì)輸入綁定進(jìn)行類(lèi)型檢查時(shí)用到的指令中聲明輸入 setter 強(qiáng)制類(lèi)型轉(zhuǎn)換字段。但是,從 TypeScript 4.3 開(kāi)始,此限制已被移除; setter 現(xiàn)在可以接受比 getter 返回的類(lèi)型更寬泛的類(lèi)型。這意味著不再需要輸入強(qiáng)制類(lèi)型轉(zhuǎn)換字段,因?yàn)樗鼈兊男Ч梢酝ㄟ^(guò)拓寬 setter 的類(lèi)型來(lái)實(shí)現(xiàn)。
例如,以下指令:
@Component({
})
export class SubmitButtonComponent {
static ngAcceptInputType_disabled: boolean|'';
private disabledValue = false;
@Input()
get disabled(): boolean {
return this.disabledValue;
}
set disabled(value: boolean) {
this.disabledValue = (value === '') || value;
}
}
可以重構(gòu)如下:
@Component({
})
export class SubmitButtonComponent {
private disabledValue = false;
@Input()
get disabled(): boolean {
return this.disabledValue;
}
set disabled(value: boolean|'') {
this.disabledValue = (value === '') || value;
}
}
使用 AOT 編譯器編譯你的應(yīng)用程序時(shí),你的模板會(huì)根據(jù)特定的嚴(yán)格級(jí)別進(jìn)行類(lèi)型檢查。在 Angular 9 之前,?fullTemplateTypeCheck
?編譯器選項(xiàng)只支持兩個(gè)嚴(yán)格級(jí)別的模板類(lèi)型檢查。在版本 9 中引入了 ?strictTemplates
?系列編譯器選項(xiàng),作為一種更細(xì)粒度的方法來(lái)配置模板的類(lèi)型檢查的嚴(yán)格程度。
?fullTemplateTypeCheck
?標(biāo)志已被棄用,取代它的是新的 ?strictTemplates
?選項(xiàng)及其相關(guān)的編譯器選項(xiàng)。當(dāng)前已配置為 ?fullTemplateTypeCheck: true
? 的項(xiàng)目可以遷移到以下編譯器選項(xiàng)集以實(shí)現(xiàn)相同級(jí)別的類(lèi)型檢查:
{
"angularCompilerOptions": {
...
"strictTemplates": true,
"strictInputTypes": false,
"strictNullInputTypes": false,
"strictAttributeTypes": false,
"strictOutputEventTypes": false,
"strictDomEventTypes": false,
"strictDomLocalRefTypes": false,
"strictSafeNavigationTypes": false,
"strictContextGenerics": false,
...
}
}
在 ViewEngine 中, JIT 編譯需要在應(yīng)用程序中注入特殊的提供者(如 ?Compiler
?、?CompilerFactory
?等)并調(diào)用相應(yīng)的方法。使用 Ivy,如果 Component、NgModule 等尚未進(jìn)行 AOT 編譯 ,則 JIT 編譯會(huì)隱式進(jìn)行。這些特殊的提供者在 Ivy 中仍然可用,以便與 ViewEngine 向后兼容,從而使向 Ivy 的過(guò)渡更加順暢。由于 ViewEngine 已被棄用并將很快被刪除,因此這些符號(hào)現(xiàn)在也已被棄用。
重要說(shuō)明:此棄用不會(huì)影響 Ivy 中的 JIT 模式(JIT 在 Ivy 中仍然可用,但是我們正在探索將來(lái)?xiàng)売盟目赡苄?。?qǐng)參閱 RFC:Angular JIT 編譯模式的用例探索)。
Angular 提供了一些用于測(cè)試 ?HttpClient
?的實(shí)用工具。 ?@angular/common/http/testing
? 中的 ?TestRequest
?類(lèi)會(huì)模擬 HTTP 請(qǐng)求對(duì)象以與 ?HttpTestingController
? 一起使用。
?TestRequest
?提供了一個(gè) API 來(lái)模擬帶有錯(cuò)誤的 HTTP 響應(yīng)。在早期版本的 Angular 中,此 API 接受 ?ErrorEvent
?類(lèi)型的對(duì)象,這與瀏覽器本機(jī)返回的錯(cuò)誤事件類(lèi)型不匹配。如果你要將 ?ErrorEvent
?與 ?TestRequest
?一起使用,就應(yīng)該切換到 ?ProgressEvent
?。
這是使用 ?ProgressEvent
?的示例:
const mockError = new ProgressEvent('error');
const mockRequest = httpTestingController.expectOne(..);
mockRequest.error(mockError);
本節(jié)包含所有當(dāng)前已棄用的 CLI 標(biāo)志的完整列表。
API/選項(xiàng) |
可能移除于 |
備注 |
---|---|---|
--prod
|
v14 |
改用 |
ng update --all
|
v14 |
已無(wú)效果。 |
API/選項(xiàng) |
可能移除于 |
備注 |
---|---|---|
deployUrl
|
v15 |
使用 |
showCircularDependencies
|
v14 |
在項(xiàng)目代碼中檢測(cè)循環(huán)依賴(lài)的推薦方法是使用 lint 規(guī)則或其他外部工具。 |
Protractor 構(gòu)建器 |
v14 |
作為 Protractor 棄用的一部分而棄用。 |
整個(gè) NPM 包已棄用。它一直是實(shí)驗(yàn)性的(從未達(dá)到 ?1.0.0
? )并且一直是 Angular CLI 的內(nèi)部包。所有相關(guān)特性都已移至 ?@angular-devkit/build-angular
? 。
從 11.0.0*開(kāi)始,已經(jīng)移除了以下 API:
包 |
API |
替代品 |
---|---|---|
@angular/router
|
preserveQueryParams
|
?queryParamsHandling ? |
Angular 會(huì)清理 ?[style]
? 和 ?[style.prop]
? 綁定,以防止惡意代碼通過(guò) CSS ?url()
? 條目中的 ?javascript:
? 表達(dá)式進(jìn)行插入。但是,大多數(shù)現(xiàn)代瀏覽器都已不再支持這些表達(dá)式的使用,所以這種清理只對(duì) IE 6 和 7 才有意義。鑒于 Angular 不支持 IE 6 或 7,并且這種清理有性能代價(jià),因此我們將不再清理 Angular 版本 10 中的樣式綁定。
不能再用 ?loadChildren
?字符串語(yǔ)法來(lái)配置惰性路由。字符串語(yǔ)法已替換為動(dòng)態(tài)導(dǎo)入語(yǔ)句。 ?DeprecatedLoadChildren
?類(lèi)型已從 ?@angular/router
? 中刪除。
支持類(lèi) ?NgModuleFactoryLoader
?、 ?SystemJsNgModuleLoader
?和 ?SystemJsNgModuleLoaderConfig
?類(lèi)已從 ?@angular/core
? 中刪除,并且 ?SpyNgModuleFactoryLoader
?已從 ?@angular/router
? 中刪除。
?WrappedValue
?是為了供變更檢測(cè)用的,它允許將相同的對(duì)象實(shí)例視為不同的。在 ?Observable
?產(chǎn)生相同值實(shí)例的情況下,它通常與 ?async
?管道一起使用。
鑒于此用例相對(duì)較少且特殊處理會(huì)影響應(yīng)用程序性能, ?WrappedValue
?API 已在 Angular 13 中刪除。
如果你依賴(lài)同一個(gè)對(duì)象實(shí)例應(yīng)該引起更改檢測(cè)的行為,你有兩個(gè)選擇:
ChangeDetectorRef.detectChanges()
?已強(qiáng)制更新。
更多建議: