จากที่เราได้เข้าใจเรื่อง Isolated Scope ไปแล้ว เรามาดูกันต่อ ใน Directive นั้นเราไม่สามารถเรียกใช้ฟังก์ชั่นต่างๆที่อยู่ใน Controller ได้

เราจำเป็นต้องใช้ Scope Expression (&)

Scope Expression (&) คือ อะไร ?

Scope Expression (&) เป็นการ Binding ฟังก์ชั่นจาก Controller ให้สามารถใช้งานใน Scope ของ Directive ได้

กรณีที่ไม่มีพารามิเตอร์

(function () {
    var app = angular.module("application", []);
     
    app.controller("demoController", function ($scope) {
        $scope.someFunction = function () {...};
    });
    app.directive("scopeand", function () {
		return {
			restrict: 'E',
			scope: {
				someAttr: '&'
			},
			template: '<button ng-click="someAttr()">Go to Work</button>'
		};
	});
     
})();

กรณีที่มีพารามิเตอร์

(function () {
    var app = angular.module("application", []);
     
    app.controller("demoController", function ($scope) {
        $scope.someFunction = function (parameter) {...};
    });
    app.directive("scopeand", function () {
		return {
			restrict: 'E',
			scope: {
				someAttr: '&'
			},
			template: '<button ng-click="someAttr({parameter:someValue})">Go to Work</button>'
		};
	});
     
})();

ทำต่อจากบทที่แล้ว ใน Controller ให้ทำการเพิ่มฟังก์ชั่น doIt()

(function () {
	var app = angular.module("application", []);
	
	app.controller("demoController", function ($scope) {
		$scope.doIt = function () {
			alert("hello");
		};
	});
	app.directive("developer", function () {...});
	
})();				

ทำการเพิ่ม attribute task ให้กับ <developer>

<body ng-controller="demoController as demo">
	<developer task="doIt()"></developer>
	<developer task="doIt()"></developer>
	<developer task="doIt()"></developer>

ทำการ Binding task ใน Directive developer ให้สามารถใช้ฟังก์ชั่น doIt(message) ใน Directive ได้

ใน Directive developer ทำการเพิ่มปุ่มลงใน template

(function () {
	var app = angular.module("application", []);
	
	app.controller("demoController", function ($scope) {
		$scope.doIt = function () {
			alert("hello");
		};
	});
	app.directive("developer", function () {
		return {
			restrict: 'E',
			scope: {
				task: '&'
			},
			template: '<div><input type="text" ng-model="work" /><button ng-click="task()">Go to Work</button></div>'
		};
	});
	
})();

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

แล้วถ้ามีพารามิเตอร์ละ

เราจะทำการเพิ่มพารามิเตอร์ให้กับฟังก์ชั่น doIt()

$scope.doIt = function (data) {
	alert(data);
};

เพิ่มพารามิเตอร์ในส่วนที่เรียกใช้ function ใน html

<body ng-controller="demoController as demo">
	<developer task="doIt(message)"></developer>
	<developer task="doIt(message)"></developer>
	<developer task="doIt(message)"></developer>

ใน Directive Developer ให้ทำการ map ตัวแปร message ให้เข้ากับค่าที่เราต้องการส่งไปในพารามิเตอร์ คือ work

  • task({message:work})
app.directive("developer", function () {
	return {
		restrict: 'E',
		scope: {
			task: '&'
		},
		template: '<div><input type="text" ng-model="work" /><button ng-click="task({message:work})">Go to Work</button></div>'
	};
});

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