สวัสดีครับ วันนี้ผมจะมาแนะนำการเขียน Basic Angular CRUD เบื้องต้น และ มีการ ดึงข้อมูลจากฐานข้อมูล MySQL จาก Rest Api โดยจะใช้ API จากบทความที่แล้วครับ BASIC RESTful Web API PHP/MySQL
เครื่องมือต่าง ๆ ที่ใช้ในบทความนี้
1.Text Editor Vs Code
2.Node Js
3.Angular Cli
ก่อนอื่นเรามาติดตั้ง Angular Cli กันก่อนครับ แต่ก่อนที่จะติดตั้ง Angular ได้ต้องติดตั้ง NodeJs ก่อนนะครับ
เปิด Command Line พิมพ์คำสั่งสำหรับติดตั้ง Angular
npm install -g @angular/cli
สร้าง Project Angular ด้วยคำสั่ง ng new ProjectName ดังนี้
ng new demo
ตัวอย่างตั้งชื่อ Project ว่า demo จากนั้นจะมีให้เลือกว่า ต้องการเพิ่ม Angular routing หรือไม่ให้ตอบ Y
จากนั้นเลือก stylesheet เป็น Css จากนั้นกด Enter
เมื่อติดตั้งเรียบร้อยแล้วเราจะมา Run Project กัน โดยใช้คำสั่ง ng serve
ng serve
เมื่อ Start Project เรียบร้อยแล้ว เปิด Web Browser ไปที่ URL : http://localhost:4200 จะแสดงหน้าจอดังภาพ
ติดตั้ง Bootstrap 4 ใน angular
เปิด Command พิมพ์คำสั่ง npm install bootstrap –save
จากนั้นไปที่ Project Angular ตัวอย่างติดตั้งไว้ที่ D:/angular/demo เปิดไฟล์ angular.json เพิ่ม CODE ดังนี้
"./node_modules/bootstrap/dist/css/bootstrap.min.css"
สร้าง Component ด้วย ng Generate
ต่อมาเราจะมาสร้าง Component สำหรับ ดู/เพิ่ม/แก้ไข/ลบ ข้อมูลกันครับ โดยเราจะใช้คำสั่ง ng generate เพื่อให้ Angular สร้าง Component ให้เราอัตโนมัติ ครับ
สามารถดู วิธีการใช้งานได้ที่ https://angular.io/cli/generate
คำสั้ง generate component employee-create สำหรับการเพิ่มข้อมูลพนักงาน
ng generate component employee-create
คำสั้ง generate component employee-update สำหรับการแก้ไขข้อมูลพนักงาน
ng generate component employee-update
คำสั้ง generate component employee-list สำหรับการดูข้อมูลพนักงาน
ng generate component employee-list
เมื่อ Generate Component เรียบร้อยแล้วจะมี Folder เกิดขึ้นที่ D:/angular/demo/src/app ดังภาพ
ต่อมาเรามาสร้าง Service ไว้สำหรับติดต่อ Api ภายนอกกันครับ
ใช้คำสั่ง ng generate service api
ng generate service api
เมื่อเรียบร้อยแล้ว angular จะมีการสร้างไฟล์ที่ D:/angular/demo/src/app/api.service.ts
โดยในตัวอย่างนี้เราจะเรียกใช้ Api ที่เคยเขียนไว้แล้วในบทความก่อนหน้านี้ครับ BASIC RESTful Web API PHP/MySQL
แก้ไขไฟล์ api.service.ts ดังนี้
import { Injectable } from '@angular/core'; //import HttpClient สำหรับ เชือมต่อ URL API ภายนอก import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class ApiService { //กำหนด URL API ที่ต้องการดึงข้อมูล URL_API = 'http://localhost/api/employee.php'; constructor(private http : HttpClient) { } //สร้าง function สำหรับเรียกดูข้อมูลทั้งหมด findAll() { return this.http.get<any>(`${this.URL_API}`); } //สร้าง function สำหรับเรียกดูข้อมูลครั้งละ 1 รายการ findOne(id:number){ return this.http.get<any>(`${this.URL_API}?id=${id}`); } //สร้าง function สำหรับบันทึกข้อมูล create(data:{}){ return this.http.post<any>(`${this.URL_API}`,data); } update(objData:{},id:number) { return this.http.put(`${this.URL_API}?id=${id}`,objData); } delete(id:number){ return this.http.delete(`${this.URL_API}?id=${id}`); } }
แก้ไขไฟล์ app.modules.ts เพิ่ม HttpClientModule และ FormsModule ดังนี้
ตัวอย่างไฟล์ app.modules.ts
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { HttpClientModule } from '@angular/common/http'; import { FormsModule } from '@angular/forms'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { EmployeeCreateComponent } from './employee-create/employee-create.component'; import { EmployeeUpdateComponent } from './employee-update/employee-update.component'; import { EmployeeListComponent } from './employee-list/employee-list.component'; @NgModule({ declarations: [ AppComponent, EmployeeCreateComponent, EmployeeUpdateComponent, EmployeeListComponent ], imports: [ BrowserModule, AppRoutingModule, HttpClientModule, FormsModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
แก้ไขไฟล์ app-routing.modules.ts ดังนี้
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { EmployeeCreateComponent } from './employee-create/employee-create.component'; import { EmployeeUpdateComponent } from './employee-update/employee-update.component'; import { EmployeeListComponent } from './employee-list/employee-list.component'; const routes: Routes = [ { path: 'employee/create', component: EmployeeCreateComponent }, { path: 'employee/:id', component: EmployeeUpdateComponent }, { path: 'employees', component: EmployeeListComponent }, { path: '', component: EmployeeListComponent, pathMatch: 'full' } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
Employee List Component สำหรับแสดงผลข้อมูล
ไปที่ D:/angular/demo/src/app/employee-list/employee-list.component.ts แก้ไข Code ดังนี้
import { Component, OnInit } from '@angular/core'; //นำเข้า function เชื่อมต่อ api จาก api.service import { ApiService } from './../api.service'; @Component({ selector: 'app-employee-list', templateUrl: './employee-list.component.html', styleUrls: ['./employee-list.component.css'] }) export class EmployeeListComponent implements OnInit { //สร้างตัวแปรสำหรับเก็บข้อมูลที่ดึงมาจาก API employees : []; //ใน constructor กำหนด ให้ apiService เป็นตัวแปรแบบ private และ เรียกใช้งาน ApiService constructor(private apiService : ApiService) { } ngOnInit() { //เรียก function getData เมื่อ App เริ่มทำงาน this.getData(); } getData(){ // เรียก function findAll จาก apiService this.apiService.findAll().subscribe((res) => { //นำข้อมูลที่ได้เก็บไว้ที่ตัวแปร employees this.employees = res }); } deleteEmployee(id:number){ // เรียก function delete จาก apiService ส่งค่า id เพิ่มลบข้อมูล this.apiService.delete(id).subscribe(res => { //เรียก function getData เพื่อแสดงข้อมูลล่าสุด this.getData(); }); } }
ไปที่ D:/angular/demo/src/app/employee-list/employee-list.component.html แก้ไข Code ดังนี้
<h3>Employees</h3> <p> <a [routerLink]="['/employee/create']" class="btn btn-success">Add</a> </p> <table class="table table-bordered table-hover"> <thead> <tr> <td width="5%">#</td> <td>First Name</td> <td>Last Name</td> <td>Email</td> <td width="10%">Edit</td> <td width="10%">Delete</td> </tr> </thead> <tbody> <tr *ngFor="let employee of employees"> <td>{{ employee.id }}</td> <td>{{ employee.first_name }}</td> <td>{{ employee.last_name }}</td> <td>{{ employee.email_address }}</td> <td><a [routerLink]="['/employee', employee.id]" class="btn btn-primary">Edit</a></td> <td><a (click) = "deleteEmployee(employee.id)" class="btn btn-danger">Delete</a> </tr> </tbody> </table>
Employee Create Component สำหรับการเพิ่มข้อมูลใหม่
ไปที่ D:/angular/demo/src/app/employee-create/employee-create.component.ts แก้ไข Code ดังนี้
import { Component, OnInit } from '@angular/core'; import { ApiService } from './../api.service'; import { Router } from '@angular/router'; @Component({ selector: 'app-employee-create', templateUrl: './employee-create.component.html', styleUrls: ['./employee-create.component.css'] }) export class EmployeeCreateComponent implements OnInit { first_name : string; last_name : string; email : string; constructor(private apiService : ApiService,private router : Router) { } ngOnInit() { } onSubmit(){ let data = { first_name : this.first_name, last_name : this.last_name, email_address : this.email } this.apiService.create(data).subscribe((res) => { if(res){ this.router.navigate(['/employees']); } }); } }
ไปที่ D:/angular/demo/src/app/employee-create/employee-create.component.html แก้ไข Code ดังนี้
<form (ngSubmit)="onSubmit()"> <div class="form-group"> <label>First Name</label> <input type="text" class="form-control" name="first_name" [(ngModel)]="first_name" > </div> <div class="form-group"> <label>Last Name</label> <input type="text" class="form-control" name="last_name" [(ngModel)]="last_name" > </div> <div class="form-group"> <label>Email</label> <input type="email" class="form-control" name="email" [(ngModel)]="email" > </div> <button type="submit" class="btn btn-primary">Save</button> <a [routerLink]="['/employees']" class="btn btn-success">Cancel</a> </form>
Employee Update Component สำหรับการแก้ไขข้อมูล
ไปที่ D:/angular/demo/src/app/employee-update/employee-update.component.ts แก้ไข Code ดังนี้
import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { ApiService } from './../api.service'; @Component({ selector: 'app-employee-update', templateUrl: './employee-update.component.html', styleUrls: ['./employee-update.component.css'] }) export class EmployeeUpdateComponent implements OnInit { first_name : string; last_name : string; email : string; id : number; constructor(private apiService : ApiService,private route: ActivatedRoute,private router: Router ) { } ngOnInit() { this.route.params.subscribe(params => { this.getEmployeeOne(params.id); }); } getEmployeeOne(id:number){ this.apiService.findOne(id).subscribe(res => { this.first_name = res[0].first_name; this.last_name = res[0].last_name; this.email = res[0].email_address; this.id = res[0].id; }); } updateData() { let data = { first_name : this.first_name, last_name : this.last_name, email_address : this.email } this.apiService.update(data,this.id).subscribe(res => { if(res){ this.router.navigate(['employees']); } }); } }
ไปที่ D:/angular/demo/src/app/employee-update/employee-update.component.html แก้ไข Code ดังนี้
<form (ngSubmit)="updateData()"> <div class="form-group"> <label>First Name</label> <input type="text" class="form-control" name="first_name" [(ngModel)]="first_name" [value]="first_name" > </div> <div class="form-group"> <label>Last Name</label> <input type="text" class="form-control" name="last_name" [(ngModel)]="last_name" [value]="last_name" > </div> <div class="form-group"> <label>Email</label> <input type="email" class="form-control" name="email" [(ngModel)]="email" [value]="email" > </div> <button type="submit" class="btn btn-primary">Save</button> <a [routerLink]="['/employees']" class="btn btn-success">Cancel</a> </form>
เมื่อแก้ไขไฟล์ทั้งหมดเรียบร้อยแล้วใช้คำสั่ง ng serve เพื่อดูผลการทำงานกันอีกครั้ง
เปิด Web Browser ไปที่ URL : http://localhost:4200
หากไม่มีอะไรผิดพลาด จะแสดงหน้าจอดังภาพ และ สามารถคลิกปุ่ม เพิ่ม / แก้ไข / ลบ ข้อมูลได้เลยครับ
ขอบคุณครับ