Dependency Injection (DI) คือ อะไร ?

DI เป็น design pattern รูปแบบหนึ่ง โดยแนวคิดคือ การเอาส่วนที่สัมพันธ์กันมารวมกัน โดยมี injector เป็นตัวเรียกใช้งาน service ให้กับตัว client

(function () {			
	var app = angular.module('someController',[]); //[] ในนี้คือที่เก็บตัวที่เป็น Service
})();

การเรียกใช้ Service

เวลาเราจะเรียกใช้งาน service จำเป็นที่จะต้องสร้างที่เก็บ service

โดยใน AngularJS เรา เรียกว่า Factory

app.factory('ชื่อ Service', function () {
	'use strict';

	return {
		ฟังก์ชั่นA : function () {
			....
		},
		ฟังก์ชั่นB : function () {
			....
		}
	};
});

โดยใน Controller จะต้องเพิ่มพารามิเตอร์เป็นชื่อของ Service เพื่อทำการเรียกใช้ Service

app.controller('someController', function ($scope, someService) {
	$scope.datas = [];

	$scope.datas = someService.getData();
}).
factory('someService', function () {
	return {
		getData: function () {
			// do something and return data
			return ...;
		}
	};
});

สิ่งที่ควรรู้เกี่ยวกับ Factory

เมื่อมีการใช้งาน Service มากกว่า 1 ที่จำไว้เสมอว่า หากมีค่าส่วนใดเปลี่ยน ส่วนอื่นก็จะมีผลกระทบด้วย เนื่องจากใช้ข้อมูลร่วมกัน

สามารถดูตัวอย่างได้จาก Demo

ไฟล์ demoservice.html (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">
	<style>.selected{background-color: red;color:white}</style>
</head>
<body>
	<div class="container" style="margin-top:100px">
        <div class="row">
            <div class="col-md-6" ng-controller="example1Controller as example1">
				<form name="form" novalidate>
					<div class="form-group">
					  <label class="col-md-4 control-label" for="textinput">Example 2 Controller</label>  
					  <div class="col-md-8">
					  	<input id="textinput" ng-model="data" name="textinput" type="text" class="form-control input-md" value="{{data}}">
					  	<span class="help-block"></span>  
					  </div>
					</div>
					<!-- Text input-->
					<div class="form-group">
					  <label class="col-md-4 control-label" for="textinput">Data</label>  
					  <div class="col-md-8">
						  {{data}}
					  	<span class="help-block"></span>  
					  </div>
					</div>
					<!-- Button (Double) -->
					<div class="form-group">
					  <label class="col-md-4 control-label" for="button1id">Double Button</label>
					  <div class="col-md-8">
						<button id="button1id" name="button1id" ng-click="get()" class="btn btn-success">GET!!</button>
						<button id="button2id" name="button2id" ng-click="set(data)" class="btn btn-danger">SET!</button>
					  </div>
					</div>
				</form>
			</div>
            <div class="col-md-6" ng-controller="example2Controller as example2">
				<form name="form" novalidate>
					<!-- Text input-->
					<div class="form-group">
					  <label class="col-md-4 control-label" for="textinput">Example 2 Controller</label>  
					  <div class="col-md-8">
					  	<input id="textinput" ng-model="data" name="textinput" type="text" class="form-control input-md" value="{{data}}">
					  	<span class="help-block"></span>  
					  </div>
					</div>
					<!-- Text input-->
					<div class="form-group">
					  <label class="col-md-4 control-label" for="textinput">Data</label>  
					  <div class="col-md-8">
						  {{data}}
					  	<span class="help-block"></span>  
					  </div>
					</div>
					<!-- Button (Double) -->
					<div class="form-group">
					  <label class="col-md-4 control-label" for="button1id">Double Button</label>
					  <div class="col-md-8">
						<button id="button1id" name="button1id" ng-click="get()" class="btn btn-success">GET!!</button>
						<button id="button2id" name="button2id" ng-click="set(data)" class="btn btn-danger">SET!</button>
					  </div>
					</div>
				</form>
			</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/demoservice.js"></script>
</body>
</html>

ไฟล์ demoservice.js (Javascript)

(function (){
	var app = angular.module('application', []);
	app.controller('example1Controller', function ($scope, demoService) {
		$scope.data = demoService.getText();
		$scope.get = function () {
			$scope.data = demoService.getText();
		};
		$scope.set = function (data) {
			demoService.setText(data);
		};
	}).
	controller('example2Controller', function ($scope, demoService) {
		$scope.data = demoService.getText();
		$scope.get = function () {
			$scope.data = demoService.getText();
		};
		$scope.set = function (data) {
			demoService.setText(data);
		};
	}). 
	factory('demoService', function () {
		return {
			text: 'Hello AngularJS Service',
			getText: function () {
				return this.text;
			},
			setText: function (value) {
				this.text = value;
			}
		};
	});
})();