สิ่งที่ควรรู้
การใช้งานฟอร์ม
จากบทที่แล้วได้พูดถึงแนวคิดแบบ 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) { }); })();