การสร้าง Service
ใน workshop ที่ผ่านมาทั้งหมด ข้อมูลจะถูก Hardcode ไว้ ซึ่งในความเป็นจริงข้อมูลส่วนใหญ่จะต้องไปดึงมาจาก Webservice อื่นๆอีกที
ลองสร้าง Service ด้วยคำสั่ง
ng generate service friend-list/HardcodedFriendListService
จะเห็นว่ามีไฟล์ใหม่เกิดขึ้น 2 ไฟล์ คือ
- src/app/friendlist/friendlist.service.ts
- src/app/friendlist/friendlist.service.spec.ts
ย้ายข้อมูลจากใน FriendListComponent มาไว้ที่ FriendListService
//friendlist.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'friendlist',
templateUrl: './friendlist.component.html',
styleUrls: ['./friendlist.component.css']
})
export class FriendlistComponent implements OnInit {
friends: string[ ];
constructor() {
}
ngOnInit() {
}
}
//friendlist.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class FriendlistService {
friends = [ "Jack", "Queen", "King" ];
constructor() { }
getAll(): string[] {
return this.friends;
}
}
ให้ FriendListComponent เรียกใช้ข้อมูลจาก FriendListService แทน
import { Component, OnInit } from '@angular/core';
import { FriendlistService } from './friendlist.service';
@Component({
selector: 'friendlist',
templateUrl: './friendlist.component.html',
styleUrls: ['./friendlist.component.css']
})
export class FriendlistComponent implements OnInit {
friends: string[ ];
constructor(friendListService: FriendlistService) {
this.friends = friendListService.getAll();
}
ngOnInit() {
}
}
ทุกครั้งที่มี Service เกิดขึ้นใหม่ จะต้องไป Register ใน ไฟล์ app.module.ts ด้วยเสมอ ( Angular ไม่ได้ทำตรงนี้ให้เรา ถึงแม้จะสร้าง Service ด้วย command ก็ตาม )
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { FriendlistComponent } from './friendlist/friendlist.component';
import { FriendlistService } from './friendlist/friendlist.service';
@NgModule({
declarations: [
AppComponent,
FriendlistComponent
],
imports: [
BrowserModule
],
providers: [
FriendlistService
],
bootstrap: [AppComponent]
})
export class AppModule { }
วิธีการนี้เรียกว่า Dependencies injection ศึกษาเพิ่มเติมได้ที่ https://angular.io/guide/dependency-injection