動態渲染 Component
看到動態我頭就疼(X),到底誰發明的?
但有的時候你就是得面對人生,因為不知道何時何地,會出現一個情境需要動態長出 Component,以下是幾個範例:
事不宜遲,我們來用 ng-bootstrap 來建立一個 Modal
首先建立 Component(喂,都應該要會背啦)
ng g c nodes-detail
接著填入 Controller 內容
import { Component, Input } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
@Component({
selector: 'app-nodes-detail',
templateUrl: './nodes-detail.component.html',
styleUrls: ['./nodes-detail.component.css']
})
export class NodesDetailComponent {
@Input() node;
constructor(public activeModal: NgbActiveModal) { }
isDanger(prop) {
return this.node[prop].used / this.node[prop].available > 0.7;
}
getType(prop) {
return this.isDanger(prop) ? 'danger' : 'success';
}
}
接著是 Template
<div class="modal-header">
<button
type="button"
class="close"
aria-label="Close"
(click)="activeModal.dismiss()"
>
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">{{ node.name }}</h4>
</div>
<div class="modal-body container">
<div class="col-xs-6">
<app-metric [used]="node.cpu.used" [available]="node.cpu.available">
<metric-title>CPU</metric-title>
</app-metric>
</div>
<div class="col-xs-6">
<app-metric [used]="node.mem.used" [available]="node.mem.available">
<metric-title>Memory</metric-title>
</app-metric>
</div>
</div>
但要怎麼動態載入 NodeDetailsComponent 呢? 首先要修改 Nodes-row Component 的 button, 綁定它的 click 事件
<td><button class="btn btn-secondary" (click)="open(node)">View</button></td>
事件定義了,就要趕快在 controller 實作 open 這個方法了!
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { NodesDetailComponent } from '../nodes-detail/nodes-detail.component';
@Component({
selector: '[app-nodes-row]',
templateUrl: './nodes-row.component.html',
styleUrls: ['./nodes-row.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class NodesRowComponent {
constructor(private modelService: NgbModal) { }
@Input() node: any;
isDanger(prop) {
return this.node[prop].used / this.node[prop].available > 0.7;
}
open(node) {
const modal = this.modelService.open(NodesDetailComponent);
modal.componentInstance.node = node;
}
}
除了開跟關之外,開在哪也很重要,因此我們要在 DashboardComponent 的 template 裡定義一個 template
<template ngbModalContainer></template>
最後的最後一步,就是要在 app.component.ts 宣告會動態出現的 Component,把它加到 entryComponents 這個陣列就對了
entryComponents: [NodesDetailComponent]
小結: