การใช้งานฟอร์ม

จากบทที่แล้วได้พูดถึงแนวคิดแบบ Two-Way Binding ของ AngularJS เราจะทำให้คุณมองเห็นภาพนั้นมากขึ้นด้วย

ด้วย Ng-Model

Ng-Model คือ อะไร ?

Ng-Model เป็น Directive ที่ใช้เชื่อมโยงค่าระหว่าง model และ view ตามแนวคิด Two-Way Binding

โดยจะใส่ไว้ใน form control ต่างๆ

<input [type=*] ng-model="ชื่อตัวแปร" />
<select ng-model="ชื่อตัวแปร" />

ตัวอย่างของ Ng-Model สามารถดูได้ที่ลิงค์นี้ Demo

ไฟล์ demo.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>
	<div class="list-group" ng-controller="demoController as demo">
		<div class="list-group-item clearfix">
			<input type="text" ng-model="text" />
			<p>Text is {{text}}</p>
			<p>เมื่อมีการเปลี่ยนแปลงค่าใน model (input) ค่าของ text ที่แสดง(view) ก็จะเปลี่ยนไปด้วย</p>
		</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/demo.js"></script>
</body>
</html>

ไฟล์ demo.js

(function () {
	'use strict';
	
	var app = angular.module('application', []);
	app.controller('demoController', function ($scope) {
		$scope.text = "test";
	});
	
})();				

Ng-Submit คือ อะไร ?

Ng-Submit เป็น Directive ที่ AngularJS ใช้ Binding Event onSubmit ที่ใช้ในการส่งค่าจากฟอร์ม

<form ng-submit="ฟังก์ชั่น/เงื่อนไข">

สร้างไฟล์ html ใหม่ แล้วทำการสร้างฟอร์มที่มี form control 3 อัน ได้แก่
  • input
  • select item
  • textarea

<!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 ng-controller="demoController as demo">
	<div class="container">
	<form class="form-horizontal" ng-submit="addData(datas)">
		<fieldset>
		<!-- Form Name -->
		<legend>Form Name</legend>
		<!-- Text input-->
		<div class="form-group">
		  <label class="col-md-4 control-label" for="textinput">Text Input</label>  
		  <div class="col-md-4">
			<input type="text" ng-model="data.text" name="textinput" id="textinput" class="form-control input-md">
		  </div>
		</div>
		<!-- Select Basic -->
		<div class="form-group">
		  <label class="col-md-4 control-label" for="selectbasic">Select Basic</label>
		  <div class="col-md-4">
			<select ng-model="data.select" id="selectbasic" name="selectbasic" class="form-control">
			  <option value="" selected></option>
			  <option value="1">Option one</option>
			  <option value="2">Option two</option>
			</select>
		  </div>
		</div>
		<!-- Textarea -->
		<div class="form-group">
		  <label class="col-md-4 control-label" for="textarea">Text Area</label>
		  <div class="col-md-4">                     
			<textarea ng-model="data.textarea" name="textarea" id="textarea"  class="form-control" >default text</textarea>
		  </div>
		</div>
		<!-- Button -->
		<div class="form-group">
			<label class="col-md-4 control-label" for="singlebutton">Submit</label>
			<div class="col-md-4">
				<button type="submit" class="btn btn-primary">Submit</button>
			</div>
		</div>
		</fieldset>
	</form>
	<!-- 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/demoform.js"></script>
</body>
</html>

สร้างไฟล์ demoform.js โดยมีรายละเอียดดังนี้

(function () {
	'use strict';
	
	var app = angular.module('application', []);
	app.controller('demoController', function ($scope) {
		$scope.datas =[];		// เก็บข้อมูลทั้งหมดที่ถูกส่งจากฟอร์ม
		$scope.data ={};		// ข้อมูลที่ผูกกับ form
		// ฟังก์ชั่น เพิ่มข้อมูลลง datas
		$scope.addData = function (datas) { 
			datas.push($scope.data);
			$scope.data = {};
		};
	});
	
})();

จากนั้นทำการใส่ ng-submit ใน <form> โดยรับตัวแปร datas เป็นพารามิเตอร์

<div class="container">
	<form class="form-horizontal" ng-submit="addData(datas)">
		<fieldset>

เพิ่มส่วนแสดงผลค่าที่ถูกส่งมา

</form>
	<div class="list-group">
		<div class="list-group-item clearfix" ng-repeat="data in datas">
			<h3>Text Input : {{data.text}}</h3>
			<h3>Select : {{data.select}}</h3>
			<h3>Text Area : {{data.textarea}}</h3>
		</div>
	</div>
</div>

จะได้ผลลัพธ์ดังนี้ Demo

Challenge 8: Add Review

อยู่ๆ คุณทานากะก็บอกว่า เค้าอยากได้หน้าเว็บส่วนของการ Review ร้าน โดยมีข้อมูลดังนี้
  • ชื่อ - สกุล
  • อีเมล์
  • จำนวนดาว
  • ข้อเสนอแนะเพิ่มเติม

โดยให้สร้างหน้า Review ร้านใหม่อยู่ในโฟลเดอร์เดียวกับที่เก็บ sushistore.html

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

ไฟล์ storereview.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">Review {{"Tanaka" | uppercase}}{{"-San"}}'s Sushi Store</h1>
      <h2 class="text-center">Open Since {{10*200}}.</h2>
    </header>
    <div class="container" ng-controller="reviewController as review">
		<div class="list-group">
			<legend>Reviews</legend>
			<blockquote ng-repeat="..."><!-- Review ทั้งหมด -->
				<b>ชื่อ - จำนวนดาว Star(s)</b>
				<p>แนะนำ</p>
				<small>อีเมล์</small>
			</blockquote>
			<blockquote>
				<b>ชื่อ - จำนวนดาว Star(s)</b>
				<p>แนะนำ</p>
				<small>อีเมล์</small>
			</blockquote>
		</div>
		<form class="form-horizontal" ng-submit="...">
			<fieldset>
			<!-- Form Name -->
			<legend>Review Form</legend>
			<!-- Text input-->
			<div class="form-group">
			  <label class="col-md-4 control-label" for="textinput">ชื่อ</label>  
			  <div class="col-md-4">
				<input type="text" ng-model="..." name="textinput" id="textinput" class="form-control input-md">
			  </div>
			</div>
			<!-- email input-->
			<div class="form-group">
			  <label class="col-md-4 control-label" for="textinput">อีเมล์</label>  
			  <div class="col-md-4">
				<input type="text" ng-model="..." name="textinput" id="textinput" class="form-control input-md">
			  </div>
			</div>
			<!-- Select Basic -->
			<div class="form-group">
			  <label class="col-md-4 control-label" for="selectbasic">Select Basic</label>
			  <div  class="col-md-4">
				<select ng-model="..." id="selectbasic" name="selectbasic" class="form-control">
				  <option value="1">1 Stars</option>
				  <option value="2">2 Stars</option>
				  <option value="3">3 Stars</option>
				  <option value="4">4 Stars</option>
				  <option value="5">5 Stars</option>
				</select>
			  </div>
			</div>
			<!-- Textarea -->
			<div class="form-group">
			  <label class="col-md-4 control-label" for="textarea">Text Area</label>
			  <div class="col-md-4">                     
				<textarea ng-model="..." name="textarea" id="textarea"  class="form-control" >default text</textarea>
			  </div>
			</div>
			<!-- Button -->
			<div class="form-group">
				<label class="col-md-4 control-label" for="singlebutton"> </label>
				<div class="col-md-4">
					<button type="submit" class="btn btn-primary">Submit</button>
				</div>
			</div>
			</fieldset>
		</form>
	</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/review.js"></script>
</body>
</html>

ไฟล์ review.js

(function () {
	'use strict';
	
	var app = angular.module('application', []);
	app.controller('reviewController', function ($scope) {
		
	});
})();