
บทเรียนการใช้งาน ng-repeat สำหรับวน Object ที่ Binding อยู่ใน html หรือ controller เชิง Key Values ให้ออกมาแสดงผลหน้าเว็บไซต์ด้วย AngularJS ครับรับ
ศึกษาบทเรียนก่อนหน้าได้ที่:
หากเรามีการ Binding Data ลงไปใน html ตรงๆ แล้วเราสามารถใช้ ng-repeat ของ AngularJS ได้อย่างง่ายๆ ครับ
วิธีการคือ
เริ่มที่เพิ่ม data-ng-init ใหม่เข้าไปที่ Tag <body> ครับตั้งชื่อให้มันว่า “group” ครับ
1 |
<body data-ng-init="group"> |
ต่อมาเพิ่ม Array ลงไปเก็บไว้ใน group อีกทีครับ
1 |
<body data-ng-init="group=['John Doh','Jane Doh','Mr. Smith','Mrs. Smith']"> |
ทีนี้เราจะวน Loop เพื่อดึงข้อมูลที่เก็บในรูปแบบ Array ในตัวแปร group ที่ init ไว้ผ่าน data-ng-repeat ครับ อาศัย tag HTML ของ <ul><li>โดยมีวิธีการเรียกดังนี้
1 2 3 4 |
Name: <input type="text" data-ng-model="name"/> {{name}} <ul> <li data-ng-repeat="person in group">{{person}}</li> </ul> |
การใช้งานคือให้เราตั้งตัวแปล person ใน data-ng-repeat ที่วนเอาชุดข้อมูลจาก group มาแสดงครับ
ไฟล์ index.html ที่เราแก้ไขจะเป็นแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!doctype html> <html data-ng-app=""> <head> <meta charset="utf-8"> <title>AngularJS</title> </head> <body data-ng-init="group=['John Doh','Jane Doh','Mr. Smith','Mrs. Smith']"> Name: <input type="text" data-ng-model="name"/> {{name}} <ul> <li data-ng-repeat="person in group">{{person}}</li> </ul> <script src="angular.min.js"></script> </body> </html> |
ทดสอบดูสักหน่อยครับ
จะเห็นว่าการวนข้อมูลนั้นส่วนของ Front End แทบจะไม่ได้ พยายามแก้ไขอะไรเกินกว่าที่คิดเลย
ต่อมาจะเป็นส่วนของ Filter ครับ
Filter คือการ กรองข้อมูล และแน่นอนสำหรับ AngularJS แล้วถัาข้อมูลไม่มากเกินไปการนำข้อมูลมาแสดงผลจะรวดเร็วมาก อีกทั้งการกรองข้อมูลแบบ Real-Time ก็จะเร็วมากเช่นกันครับ
เราสามารถกรองข้อมูลได้โดยวิธีการดังนี้ครับ
ให้เราทำ data-ng-init ใหม่ขึ้นมาครับชื่อว่า “customers” ครับ และเพิ่ม Array เข้าไปเช่นเดิมแค่เปลี่ยนเล็กน้อยให้เราใช้ Array 2 มิติที่ประกอบไปด้วย key ที่ชื่อ name และ city ครับ
1 2 3 4 5 6 7 |
<body data-ng-init="customers=[ {name:'John Doh', city:'Bangkok'}, {name:'Jane Doh',city:'Nonthaburi'}, {name:'Mr. Smith',city:'Chiang Mai'}, {name:'Mrs. Smith',city:'Phuket'}]"> Name: <input type="text" data-ng-model="name"/> {{name}} |
ใช้ data-ng-repeat ใหม่ผ่าน Tag HTML ของ <ul><li> ตามนี้ครับ
1 2 3 |
<ul> <li data-ng-repeat="cust in customers">{{cust.name}}, {{cust.city}}</li> </ul> |
เราจะวนเอา key ของ name และ city มาใช้ร่วมกับตัวแปร cust ที่วนลูป มาจาก customers ที่เรา init ไว้ครับ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!doctype html> <html data-ng-app=""> <head> <meta charset="utf-8"> <title>AngularJS</title> </head> <body data-ng-init="customers=[ {name:'John Doh', city:'Bangkok'}, {name:'Jane Doh',city:'Nonthaburi'}, {name:'Mr. Smith',city:'Chiang Mai'}, {name:'Mrs. Smith',city:'Phuket'}]"> Name: <input type="text" data-ng-model="name"/> {{name}} <ul> <li data-ng-repeat="cust in customers"> {{cust.name}}, {{cust.city}} </li> </ul> <script src="angular.min.js"></script> </body> </html> |
ส่วนการ Filter นั้นเราจะใช้ TextBox ที่ชื่อ ng-model ว่า “name” เป็นตัวกรองแบบ Real Time ครับ
ให้แก้ไข data-ng-repeat ตามนี้ครับ
1 2 3 |
<li data-ng-repeat="cust in customers | filter:name"> {{cust.name}}, {{cust.city}} </li> |
อีกทั้งเราสามารถใช้ orderBy คือการเรียงลำดับอย่าง ASC และ DESC มาใช้ได้เช่นกันครับตามภาพตัวอย่างข้างล่าง
เกล็ดเพิ่มเติมสำหรับคนที่ต้องการใช้ Uppercase หรือ Lowercase ตัวอักษรแบบตัวพิมพ์ใหม่ หรือพิมพ์เล็ก เราสามารถใช้ได้แบบนี้ครับ
1 2 3 4 5 |
<ul> <li data-ng-repeat="cust in customers | filter:name | orderBy:city"> {{cust.name | uppercase}}, {{cust.city|lowercase}} </li> </ul> |
เป็นอันว่าง่ายครับ และรวดเร็วอีกต่างหากครับ
บทเรียนต่อไปเป็นการทำ ng-repeat ร่วมกับ Tag HTML ของ table ครับ และแยกไฟล์ Controller ออกจาก View ครับ
AngularJS การแยก Controller และทำงานร่วมกับ Table