Filter คือ อะไร ?

ในการแสดงผลข้อมูลต่างๆ จะมีตัว filter เป็นตัวกรองข้อมูล ให้อยู่ในรูปแบบ (format) ที่ต้องการ

โดย Filter ของ AngularJS จะใส่อยู่ใน Expression ต่อจากข้อมูล หรือใน ng-repeat ก็ได้

{{ข้อมูล | filter ที่ใช้}}
ng-repeat="ข้อมูล in Array | filter ที่ใช้"

แล้วเราจะทำยังไงกับ Array ?

$scope.sushi = [
	{
		name: 'Maguro',
		price: 200,
		description: 'Fat Tuna'
	},
	{
		name: 'Tamago',
		price: 120,
		description: 'Rice with Egg'	
	},...
];

ในแบบฝึกหัดชุดนี้เราจะกล่าวถึง Filter บางส่วนดังนี้

  • Currency

    - แสดงผลเป็นค่าเงินต่างๆ สามารถกำหนดสัญลักษณ์ได้ (default เป็น $)

    {{10000 | currency}}	    $10,000.00
    {{5000.50 | currency:'฿'}}   ฿5,000.50
  • Date

    - แสดงผลเป็นวันเดือนปี โดยสามารถระบุรูปแบบได้

    {{1288323623006 | date}}			Oct 29, 2010
    {{1288323623006 | date:'medium'}}		Oct 29, 2010 10:40:23 AM
    {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}	10/29/2010 @ 10:40AM
    
  • Number

    - แสดงข้อมูลจำนวนเต็มในรูปแบบ String ระบุจำนวนทศนิยมได้ (default ทศนิยมคือ 3)

    {{1234.56789 | number}}		1,234.568
    {{1234.56789 | number:0}}	1,235
    {{1234.56789 | number:2}}	1,234.57
    
  • JSON

    - แสดงข้อมูลในลักษณะของ JSON Object

    {{store.sushi | json}}
    
  • Lowercase

    - ทำให้ข้อมูลที่แสดงผลเป็นพิมพ์เล็กหมด

    {{"Hello,AngularJS" | lowercase}}	hello,angularjs
    
  • Uppercase

    - ทำให้ข้อมูลที่แสดงผลเป็นพิมพ์ใหญ่หมด

    {{"Hello,AngularJS" | uppercase}}	HELLO,ANGULARJS
    
  • limitTo

    - ถ้าใช้กับข้อมูลที่เป็น string จะเป็นการกำหนดจำนวนตัวอักษร

    {{"ABCDEFGHI" | limitTo: 5}}	ABCDE
    

    - ถ้าใช้กับข้อมูลที่เป็น Array จะเป็นการกำหนดจำนวนที่จะแสดง

    {{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] | limitTo: 5}}	[1, 2, 3, 4, 5]
    

    สามารถใช้กับ ng-repeat ได้

    <div ng-repeat="sushi in store.sushi | limitTo:2">
    
  • orderBy

    - ทำการเรียงข้อมูลใน array สามารถเรียงได้จาก ตัวแปรต่างๆของข้อมูล และแบบย้อนกลับ

    <div ng-repeat="sushi in store.sushi | orderBy:'price'">
    <div ng-repeat="sushi in store.sushi | orderBy:'price':'reverse'">
    

Challenge 5: How's sushi fresh?

คุณทานากะต้องการให้เราแก้ไข 3 ส่วน คือ

ให้ชื่อของเจ้าของร้านเป็นตัวพิมพ์ใหญ่หมด TANAKA-San's Sushi Shop

การแสดงผลเงิน จาก 000 yen เป็น 000.00 yen

ทำการเพิ่มวันที่สินค้าเข้ามาใหม่ เพื่อระบุถึงความสด และแสดงเป็นวันที่บอก

โดยมีโค้ดให้บางส่วน จงเติมส่วนที่ขาดหายไป เพื่อให้เว็บทำงานได้

Hint: วันที่ต้องเป็น Date Object ให้ใช้ Date()

สามารถดูผลลัพธ์ได้ที่ Demo

ไฟล์ sushistore.html

<!DOCTYPE html>
<html ng-app="application">
<head>
	<meta charset="utf-8">
    <!-- bootstrap CSS -->
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <!-- bootstrap theme -->
    <link rel="stylesheet" href="css/bootstrap-theme.min.css">
</head>
<body>
	<header>
      <h1 class="text-center">{{"Tanaka-San"}}'s Sushi Store</h1>
      <h2 class="text-center">Open Since {{10*200}}.</h2>
    </header>
    <div class="container">
        <div class="row">
            <div class="col-md-6">
				<div class="list-group" ng-controller="storeController as store" >
					<div class="list-group-item" ng-repeat="sushi in sushis">
						<h1>{{sushi.name}}</h1>
						<h2>{{sushi.price}} yen</h2>
						<p>[date!!!] - {{sushi.description}}</p>
						<button class="btn btn-default" ng-show="sushi.canPurchase">สั่งซื้อ</button>
						<h3 ng-hide="sushi.canPurchase">ขายหมดแล้วจ้า</h3>
					</div>
				</div>
            </div>
		</div>
	</div>
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="js/lib/jquery.min.js"></script>
    <!-- Bootstrap JavaScript -->
    <script src="js/lib/bootstrap.min.js"></script>
    <!-- AngularJS JavaScript -->
    <script src="js/lib/angular.min.js"></script>
    <script src="js/app.js"></script>
</body>
</html>

ไฟล์ app.js

(function () {
	'use strict';
	
	var app = angular.module('application', []);
	app.controller('storeController', function ($scope) {
		$scope.sushi = [
			{
				name: 'maguro',
				price: 200,
				description: "Fat Tuna",
				canPurchase: true
				....
			},
			{
				name: 'Tamago',
				price: 120,
				description: "Rice With Egg",
				canPurchase: true
				....
			},
			{
				name: 'Ebi',
				price: 150,
				description: "Rice With shrimp",
				canPurchase: true
			},
			{
				name: 'Tamago',
				price: 180,
				description: "Rice With Octopus",
				canPurchase: true
				....
			}
		];
	});
	
})();