เริ่มด้วยการสร้าง Component ชื่อ product-alerts อย่าลืมใช้คำสั่ง ng generate component product-alerts
แล้วเพิ่มปุ่ม Notify Me ใน Template
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-product-alerts', templateUrl: './product-alerts.component.html', styleUrls: ['./product-alerts.component.css'] }) export class ProductAlertsComponent implements OnInit { constructor() { } ngOnInit() { } }
<p> <button>Notify Me</button> </p>
และเพิ่ม product-alerts ใน product-list อีกที
<h1>{{title}}</h1> <div *ngFor="let product of productList"> <a [title]="'Description: ' + product.description"> {{product.name}} </a> <p *ngIf="product.description"> {{product.description}} </p> <button (click)="share()"> Share </button> <app-product-alerts></app-product-alerts> </div>
ต่อมาเราจะทำการประกาศ @Input() เพื่อให้ส่งค่าเข้าไปใน Component "product-alerts" ได้
แล้วกำหนดค่าที่จะส่งค่าให้ Component ใน Template อีกทีด้วยการ Attribute Binding [ ]
จากนั้นทดสอบด้วยการกำหนดว่าถ้า product.price > 700 จะให้แสดงปุ่ม
import { Component, OnInit } from '@angular/core'; import { Input } from '@angular/core'; @Component({ selector: 'app-product-alerts', templateUrl: './product-alerts.component.html', styleUrls: ['./product-alerts.component.css'] }) export class ProductAlertsComponent implements OnInit { @Input() product; constructor() { } ngOnInit() { } }
<p *ngIf="product.price > 700"> <button>Notify Me</button> </p>
<h1>{{title}}</h1> <div *ngFor="let product of productList"> <a [title]="'Description: ' + product.description"> {{product.name}} </a> <p *ngIf="product.description"> {{product.description}} </p> <button (click)="share()"> Share </button> <app-product-alerts [product]="product" ></app-product-alerts> </div>
เพิ่ม price ใน "products.ts"
export const products = [ { name: 'Phone XL', description: 'A large phone with one of the best screen', price: 799 },{ name: 'Phone Mini', description: 'A great phone with one of the best cameras', price: 699 },{ name: 'Phone Standard', description: '', price: 299 } ]
การแจ้งเตือนเมื่อทำการกด "product-alerts" แล้วไปเรียกใช้งาน Function ใน "product-list"
ให้เราทำการเพิ่ม Function onNotify() ที่ Component "product-list" ก่อน
แล้วทำการเพิ่ม Event Binding เมื่อมีการส่ง notify เข้ามาให้ไปทำงานที่ Function onNotify() แบบนี้ (notify)="onNotify()"
import { Component, OnInit } from '@angular/core'; import { products } from '../static/products'; @Component({ selector: 'app-product-list', templateUrl: './product-list.component.html', styleUrls: ['./product-list.component.css'] }) export class ProductListComponent implements OnInit { title = 'Product List'; productList = products; share() { window.alert("The product has been shared!"); } onNotify() { window.alert('You will be notified when the product goes on sale'); } constructor() { } ngOnInit() { } }
<h1>{{title}}</h1> <div *ngFor="let product of productList"> <a [title]="'Description: ' + product.description"> {{product.name}} </a> <p *ngIf="product.description"> {{product.description}} </p> <button (click)="share()"> Share </button> <app-product-alerts [product]="product" (notify)="onNotify()"></app-product-alerts> </div>
ส่วนของ "product-alerts" เพิ่ม @Output ชื่อ notify เป็น EventEmitter เพื่อให้ส่งค่าออกมาได้
และ Event Binding เมื่อทำการ Click ให้เรียก notify.emit()
import { Component, OnInit } from '@angular/core'; import { Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'app-product-alerts', templateUrl: './product-alerts.component.html', styleUrls: ['./product-alerts.component.css'] }) export class ProductAlertsComponent implements OnInit { @Input() product; @Output() notify = new EventEmitter(); constructor() { } ngOnInit() { } }
<p *ngIf="product.price > 700"> <button (click)="notify.emit()">Notify Me</button> </p>
ทำความเข้าใจพาทนี้ ถ้ามองการเชื่อมโยงกันระหว่าง Template ก็จะค่อนข้างเข้าใจยากเล็กน้อย แต่จริงๆ แล้วให้มองที่ตัว Type Script เป็นหลักจะทำความเข้าใจได้ง่ายกว่า
นึกว่า ไฟล์ .ts เป็น Function ย่อย ๆ ก็จะเห็นได้ชัดว่า "product-alerts.component.ts" จะมี Input และ Output ก็เหมือน Parameter และ Return เท่านั้น
ไม่มีความคิดเห็น:
แสดงความคิดเห็น