$rootScope คือ อะไร ?

ใน AngularJS จะมี $rootScope เป็นจุดเริ่มต้นของ $scope ทั้งหมดที่กำหนดข้อมูลและฟังก์ชั่นต่างๆ

โดยในแต่ละ Controller และ Directive ก็จะมี $scope ที่แตกออกมาจาก $rootScope อีกที

หากไม่ได้กำหนดข้อมูลใหม่ จะมีค่าเหมือนที่กำหนดไว้ใน $rootScope

โดยปกติไม่จำเป็นต้องยุ่งกับ $rootScope ให้ใช้ตัวแปร $scope แทน

ตัวอย่างอธิบาย Scope ของตัวแปร

จากที่เราได้รู้ว่า ตัวแปรใน Controller ใช้นอก Controller ไม่ได้ แล้วถ้าเป็น Controller ใน Controller ละจะมีปัญหาอะไรไหม

angular.module('application', [])
    .controller('zoneone', function ($scope, $rootScope) {
        this.value = "Hello";
       	$scope.value = "Bye";
		$rootScope.value = "RootScope";
    })
    .controller('zonetwo', function ($scope) {
        this.value = "World";
    })
    .controller('zonethree', function ($scope) {
        this.value = "AngularJS";
    })
    .controller('zonefour', function ($scope) {
        this.value = "Javascript Framework";
		$scope.value = "jQuery";
	});

และเรียกใช้ใน Controller ดังนี้

<div ng-controller="zoneone as one">
	<p>one.value in controller zoneone : \{\{one.value}}</p>
	<p>$scope.value in controller zoneone : \{\{value}}</p>
	<div ng-controller="zonetwo as two">
		<p>two.value in controller zonetwo : \{\{two.value}}</p>
		<p>$scope.value in controller zonetwo : \{\{value}}</p>
	</div>
</div>
<div ng-controller="zonethree as three">
	<p>three.value in controller zonethree : \{\{three.value}}</p>
	<p>$scope.value in controller zonethree : \{\{value}}</p>
	<div ng-controller="zonefour as four">
		<p>four.value in controller zonefour : \{\{four.value}}</p>
		<p>$scope.value in controller zonefour : \{\{value}}</p>
	</div>
</div>

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

one.value in controller zoneone : {{one.value}}

$scope.value in controller zoneone : {{value}} เป็นข้อมูลของ $scope [zoneone]

two.value in controller zonetwo : {{two.value}}

$scope.value in controller zonetwo : {{value}} เป็นข้อมูลของ $scope [zoneone]

three.value in controller zonethree : {{three.value}}

$scope.value in controller zonethree : {{value}} เป็นข้อมูลของ $rootScope

four.value in controller zonefour : {{four.value}}

$scope.value in controller zonefour : {{value}} เป็นข้อมูลของ $scope [zonefour]

สังเกตได้ว่าตัวแปรที่กำหนดไว้ใน $rootScope หากมีการกำหนดที่ $scope ค่าจะกลายเป็นของ $scope นั้นๆ

ในกรณีที่ไม่ได้กำหนดใน $scope นั้นๆ ค่าจะกลายเป็นของ $rootScope

ตัวอย่างการสืบทอดของ $scope

ตัวอย่างนี้จะแสดงให้เห็นถึงวิธีการสืบทอดค่าใน $scope

ในไฟล์ js ทำการกำหนดดังนี้

angular.module('application', [])
    .controller('rootController', function ($scope) {
		$scope.text = "root";
	})
	.controller('branchController', function ($scope) {
		$scope.text = $scope.text + " - branch";
	})
	.controller('nodeController', function ($scope) {
		$scope.text += " - node";
	});

ในไฟล์ html ทำการกำหนดดังนี้

<div ng-app="application" ng-controller="rootController as root">
	<p>$scope.text in root : \{\{text}}</p>
	<div ng-controller="branchController as branch">
		<p>$scope.text in branch : \{\{text}}</p>
		<div ng-controller="nodeController as node">
			<p>$scope.text in node : \{\{text}}</p>
		</div>
	</div>
</div>

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

$scope.text in root : {{text}}

$scope.text in branch : {{text}}

$scope.text in node : {{text}}

จะเห็นได้ว่าข้อมูลนั้นมีการสืบทอดต่อกันมา