เริ่มต้นเขียน Angular2 กันดีกว่า
เมื่อเร็วๆนี้ Angular ได้ปล่อยตัว Angular 4 ออกมา ซึ่งจริงๆแล้ว มันก็ไม่ได้แตกต่างกับ Angular 2 เท่าไหร่นัก เป็นเพียงแค่ Improve Feature เล็กๆน้อยๆ ไม่ได้ Major change แบบตอน Angular 1 มา Angular 2 นั่นเอง
วันนี้ก็เลยมานำเสนอบทความการเขียน Angular 2 ฉบับเริ่มต้นกันครับ ซึ่งตัว Angular 2 นั้นเขียนด้วย TypeScript และตัวอย่างของวันนี้จะเป็นเว็บแบบ Single Page Application ที่เอาไว้แสดงข้อมูล Heroes ของเกม Dota 2 ครับ
หน้าตาของ App เมื่อเขียนเสร็จก็จะได้ประมาณรูปด้านล่างครับ
จะเรียก Angular เวอร์ชั่น 2 ขึ้นไปว่า Angular ส่วน Angular 1.x จะเรียกว่า AngularJS
Enviroments
ในตัวอย่างนี้จะใช้ Angular-cli ในการสร้างโปรเจ็ค รวมถึงการสร้าง Component และเขียนด้วย TypeScript
ฉะนั้นสิ่งที่ควรมีก็คือ
- Node.js v6.9.5
- TypeScript v2.1.5
- Angular CLI v1.0.0-beta.30
หากยังไม่ได้ติดตั้ง Node.js สามารถอ่านได้จากบทความนี้ Node.js คืออะไร ? + เริ่มต้นใช้งาน Node.js
Step 1 : Installation
บน Mac OS X หรือ Linux อาจจะต้องติดตั้ง Watchman เพิ่มเติม (ตัว Watchman เอาไว้สำหรับ Monitoring file ของ AngularCLI)
หากไม่มี Homebrew หรือยังไม่รู้จัก อ่านบทความนี้ครับ Homebrew คืออะไร? + สอนวิธีใช้งาน
Step 2 : Create Project
เริ่มต้นสร้างโปรเจ็ค Angular ด้วยการใช้ angular-cli
จะใช้คำสั่ง ng new <ชื่อโปรเจ็ค>
ครับ
ไฟล์และ dependencies ต่างๆจะถูกติดตั้งด้วย angular-cli
เมื่อสร้างโปรเจ็คด้วย angular-cli เสร็จแล้ว ก็ลองรัน server ดูด้วยคำสั่ง ng serve
เข้าเว็บผ่าน http://localhost:4200/ จะเห็นหน้าเว็บ Angular
Step 3 : Project Structure
เมื่อลอง browse file ในโฟลเดอร์ src
จะเห็นว่ามีไฟล์และโฟลเดอร์ต่างๆดังด้านล่างนี้
ลองดูที่ไฟล์ src/app/app.component.html
จะสังเกตเห็น tag <app-root>
ใน Element <app-root>Loading...</app-root>
ซึ่งหากใน AngularJS (Angular 1) จะเรียกว่า Diretives ส่วนใน Angular (Angular 2)เราจะเรียกมันใหม่ว่า Component
แล้วทีนี้ Component ใน Angular มันสร้างมาได้ยังไง? ลองเปิดไฟล์ src/app/app.component.ts
ขึ้นมา
จากโค๊ดด้านบน มีการ import Component
จากโมดูล @angular/core
และประกาศ Component โดยมี property คือ
selector
: ชื่อ component ที่เราต้องการ เช่นapp-root
เวลาใช้งานก็คือ<app-root></app-root>
templateUrl
: Path ไฟล์ html ที่เราต้องการให้ Component นี้มัน renderstyleUrls
: สามารถกำหนด stylesheet เฉพาะ component ได้template
: หรือหากไม่ระบุ url ก็สามารถใส่ HTML tag ลงไปในนี้ได้เลย
ซึ่งหากสังเกตแล้ว จริงๆ 1 component ของ Angular จะมีด้วยกัน 4 ไฟล์ คือ
app.component.css
: เอาไว้สำหรับจัดการ stylesheet ของ component นั้นapp.component.html
: ไฟล์ html template ของ Componentapp.component.spec.ts
: ไฟล์สำหรับ testapp.component.ts
: ไฟล์สำหรับ implement logic component
Step 4 : Generate component
เนื่องจากว่าตอนเราสร้างโปรเจ็คด้วย Angular-CLI app.component
จะถูกสร้างมาให้อัตโนมัติอยู่แล้ว ทีนี้เราลองมาสร้าง Component เพิ่มด้วยคำสั่ง CLI กันครับ
คำสั่งก็ง่ายๆเลยคือ ng generate component <ชื่อ component>
เช่น
หรือจะใช้คำสั่งแบบสั้นๆ ก็ได้ คือ
ng g c about
จะเห็นว่าไฟล์ถูกสร้างมา 4 ไฟล์ รูปแบบคล้ายๆการสร้าง 1 Component และมีอัพเดทไฟล์ src/app/app.module.ts
ซึ่งหากเราเปิดไฟล์ app.module.ts
ดูจะพบว่า
สิ่งสำคัญมีอยู่ 3 ส่วนครับ คือ
declarations
: เอาไว้กำหนด Component ของเราให้ใช้ได้ภายใน app ถ้าไม่ใส่ในส่วนนี้ Component ที่เราสร้างมาตัว angular จะไม่รู้จักimports
: สำหรับ import โมดูลต่างๆเพื่อเอาไว้ใช้ในโปรเจ็ค เช่นHttpModule
สำหรับ GET/POST Http เป็นต้นproviders
: ตัวนี้จะเป็นสำหรับส่วนที่เอาไว้ประกาศ เวลาเรามี Service
Step 5: Create Routing
ต่อมาเป็นการสร้าง Routing เพื่อจะกำหนดว่า เวลาเราเข้า path นี้ จะให้มันไปไหน เช่น เข้า /about
จะให้แสดงหน้า About เข้าหน้า /heroes
ก็แสดงรายชื่อ Heroes เป็นต้น
ตัวอย่างการกำหนด Routing โดย App นี้จะแบ่งออกเป็น 3 หน้าคือ
- Home : เป็นหน้าแรก
- Heroes : แสดงรายชื่อ Heroes
- About : หน้ารายละเอียด
ซึ่งทัง้สามหน้า จะเป็นแค่ Static website มีเพียงแค่ Heroes ที่จะต้องดึง Service API นั่นเอง
สร้างไฟล์ชื่อ app-routing.module.ts
ขึ้นมา
โดย Angular จะมาพร้อมโมดูล RouterModule
และ Routes
ให้เราไว้สำหรับ Config Routing อยู่แล้ว เราก็กำหนดได้เลยว่า path = about
ให้มันแสดง component ชื่อ AboutComponent
ตัว
path
ไม่ต้องใส่ slash (/
)
กลับไปที่ไฟล์ app.module.ts
ทำการ import RoutingModule
ที่เราสร้างนี้ไปด้วย
และที่ไฟล์ app.component.html
ให้เราเพิ่ม tag <router-outlet></router-outlet>
เพื่อให้ Angular Router ทำงานนั่นเอง เมื่อเวลา Routing มันแมตกับ path ที่เรากำหนด ตัว Component ก็จะ replace ข้อมูลแทนแท็กนี้นั่นเอง
ต่อมา Generate หน้า Home และ Hero List สำหรับเป็น Component และ map routing ไว้ก่อน (ยังไม่มีคอนเท้น)
และทำการเพิ่ม Routing ในไฟล์ app-routing.module.ts
โดย path: ''
คือจะเป็นหน้า Home และ path: '**'
คือไม่เจอ path ใดๆเลย จะให้มัน redirect ไปที่ Home นั่นเอง
ตอนนี้ App เราก็มี 3 หน้าแล้ว คือ
Step 6: Services
ต่อมาส่วน Service ที่เราใช้ request เพื่อจะได้ข้อมูล Heroes แบบทั้งหมด และอีก request สำหรับ Hero id นั้นๆ
ไฟล์ชื่อ hero.service.ts
จะเห็นว่าโค๊ดด้านบน มีการ import { Http } from '@angular/http';
ซึ่งเป็น module สำหรับ Http ในส่วนของ
จะมีค่าเท่ากับเราประกาศ
คือเราทำการประกาศตัวแปร http ใน constructor ได้เลย
ต่อมาไฟล์ hero-list/hero-list.component.ts
ด้านบน เรา Inject HeroService
ที่สร้างไว้ มาไว้ในนี้ผ่านตัวแปร heroService
จากนั้นก็สามารถ call method findAll
ได้เลย
แต่จะเห็นว่ามีส่วน .subscribe()
ตรงนี้ทำหน้าที่คล้ายๆกับ Promise().then()
คือเมื่อได้ response มันก็จะ ทำงานในส่วนของ subscribe()
ซึ่งในที่นี้คือ นำค่า response ไปใส่ไว้ตัวแปรชื่อ heroes
เช่นเดียวกันกับ hero/hero.component.ts
จะ Implement คล้ายๆกัน เพียงแต่ ส่วนที่เป็น /heroes/:id
จะต้องใช้ ActivatedRoute
ในการหา params ดังโค๊ดด้านล่าง
สุดท้าย เพิ่ม HeroService
ไปในส่วน provider ของ app.module.ts
ด้วย
Step 7: Add HTML Markup
ต่อมาผมทำการเพิ่ม HTML Markup ของแต่ละหน้าเริ่มจากไฟล์ index.html
ทำการเพิ่ม CSS ของ Bulma
ต่อมาไฟล์ app.component.html
ก็จะเพิ่มส่วน Navbar เพื่อจะได้ Link ไปหน้าต่างๆได้
ซึ่ง HTML Tag ด้านบน เราจะเห็น routerLink
และ routerLinkActive
ซึ่งเป็นส่วนของ Angular Router โดย routerLink
เอาไว้สำหรับบอกว่า Link นี้ จะไปไหน โดยมันจะไป map กับที่เรา config ไว้ใน app-routing.module.ts
นั่นเอง
ไฟล์ app.component.css
(บทความใช้ .scss
)
ต่อมา ส่วนหน้า About ก็ใส่ Content เพิ่มเข้าไป
หน้า hero-list/hero-list.component.html
ก็เช่นเดียวกัน
และสุดท้ายหน้า Hero Detail hero/hero.component.ts
Step 8: Backend
สำหรับส่วน Backend จะไม่อธิบายถึงละกันครับ เพราะว่าอยู่นอก scope ของบทความ ซึ่งสามารถดูได้จาก Link นี้ https://github.com/Phonbopit/node-x-angular/tree/master/server
ซึ่งเมื่อเราทำการรัน Server หรือ มี response จาก backend ตัวหน้าเว็บที่เราทำไว้ก็จะสามารถใช้งานได้นั่นเอง
เป็นอันเรียบร้อย :)
Conclusion
บทความนี้ก็เป็นคล้ายๆ Walkthrough สำหรับทำ Single Page Appliction ด้วย Angular 2 หรือ 4 แบบง่ายๆนะครับ อาจจะไม่ได้เจาะลึกลงไปในแต่ละรายละเอียด ซึ่งอยากให้มองเห็นภาพรวมแล้วก็ไปต่อยอดศึกษาเพิ่มเติมเอาเองนะครับ เช่น Angular Router ว่ามันทำอะไรได้บ้าง หรือ RxJS หรือ Observable มันใช้ยังไง ทำอะไรอีกได้บ้าง เป็นต้น หวังว่าบทความนี้จะมีประโยชน์กับผู้ที่กำลังสนใจ Angular นะครับ
สุดท้าย Source Code สามารถดูได้จาก Link ด้านล่างเลยครับ
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust