1. 程式人生 > >Angular Elements,四步將Angular 元件轉換為 web 元件

Angular Elements,四步將Angular 元件轉換為 web 元件

Angular Elements,四步將Angular 元件轉換為 web 元件

從Angular版本6開始,我們可以將Angular元件公開為Web元件,或者更確切地說:作為自定義元素,它是Web元件這一術語的標準之一。它們可以在每個框架中重複使用,甚至可以與原生JS一起使用。除此之外,我們可以在執行時輕鬆建立它們,因為它們是由瀏覽器呈現的。動態新增新的DOM節點。

在這裡,我正在使用這個想法來構建動態dashboard。
在這裡插入圖片描述
該原始碼可以在這裡檢視

第1步: 安裝 Angular Elements 和 Polyfills

毫無疑問,Angular Elements可以通過npm安裝。除此之外,我還安裝@webcomponents/custom-elements這個polyfills Custom Elements 可以支援Internet Explorer 11。

npm i @angular/elements --save
npm i @webcomponents/custom-elements --save

在此之後,您還可以在結尾處參考polyfill polyfills.ts:

import '@webcomponents/custom-elements/custom-elements.min';

需要在您的引用中引用此包的另一個檔案angular.json:

"scripts": [
  "node_modules/@webcomponents/custom-elements/src/native-shim.js"
]

Web元件是在EcmaScript 2015+定義的。
作為替代方案,您可以安裝@angular/elements,使用ng add命令:

ng add @angular/elements

此命令也會下載polyfill並在其中引用它angular.json。

第2步:建立Angular元件

dashboard 的Angular 元件程式碼,我希望將其視為Web元件,如下所示:

@Component({
  // selector: 'app-dashboard-tile',
  templateUrl: './dashboard-tile.component.html',
  styleUrls: ['./dashboard-tile.component.css']
})
export class DashboardTileComponent  {
  @Input() a: number;
  @Input() b: number;
  @Input() c: number;
}

我沒有使用選擇器,因為Custom專案在註冊時會分配一個。這樣,我防止命名衝突。

第3步:將Angular 元件註冊為自定義元素

為了將Angular 元件公開為自定義元素,我們需要宣告它並將其放在entryComponents模組的部分中。這是必要的,因為Angular Elements在執行時動態建立它:

@NgModule({
  […],
  declarations: [
    […]
    DashboardTileComponent
  ],
  entryComponents: [
    DashboardTileComponent
  ]
})
export class DashboardModule { 

  constructor(private injector: Injector) {

    const tileCE = createCustomElement(DashboardTileComponent, { injector: this.injector });
    customElements.define('dashboard-tile', tileCE);

  }

}

方法createCustomElement包裝DashboardTileComponent它看起來像Web元件的方式。使用customElements.define我們可以在瀏覽器中註冊它。

第4步:使用自定義元素

現在,我們可以像所有其他內建HTML標記一樣使用自定義元素:

<dashboard-tile a="100" b="50" c="25"></dashboard-tile>

當瀏覽器呈現它時,Angular不知道元素名稱dashboard-tile。為了防止它丟擲錯誤,我們必須使用CUSTOM_ELEMENTS_SCHEMA:

@NgModule({
  […]
  schemas: [
    CUSTOM_ELEMENTS_SCHEMA
  ]
})
export class AppModule {
}

我們甚至可以動態建立一個DOM節點,它是動態UI的一個關鍵:

const tile = document.createElement('dashboard-tile');
tile.setAttribute('class', 'col-lg-4 col-md-3 col-sm-2');
tile.setAttribute('a', '100');
tile.setAttribute('b', '50');
tile.setAttribute('c', '25');

const content = document.getElementById('content');
content.appendChild(tile);

如果你想確保你的應用程式也支援其他環境 - 例如伺服器端渲染或混合應用程式 - 你應該使用抽象DOM操作的服務。