AngularJS指令通信教程

时间:2020-02-23 14:29:34  来源:igfitidea点击:

在先前的文章中,我们讨论了有关自定义指令和隔离范围的一系列教程。
有时您可能想构建一个由指令组合构建的组件。
在本文中,我们将讨论这个概念以及嵌套指令之间的通信。
在指令之间进行通信的方法有很多,但是在本文中,我们将讨论使用控制器作为API的通信。

AngularJS嵌套指令

您可以使用以下语法创建嵌套指令:

var app = angular.module('moduleName', []);

	app.directive("First", function() {
		return {
                   //code goes here
		};
	});
	app.directive("Second", function() {
		return {
                  //code goes here
		};
	});

	app.directive("third", function() {
		return {
                  //code goes here
		};
	});

您也可以使用以下语法创建相同的语法。
在这种情况下,我们不复制变量,而是使用dot(.)运算符。

var app = angular.module('moduleName', []);

	app.directive("First", function() {
		return {
                   //code goes here
		};
	})
	.directive("Second", function() {
		return {
                  //code goes here
		};
	})
	.directive("Third", function() {
		return {
                  //code goes here
		};
	})

AngularJS指令通信

让我们通过以下示例讨论这个概念。
在这篇文章中,我们将创建三个指令shapetrianglecircle

  • " shape"指令定义了一个具有两个功能的控制器,用于将值推入shapes数组。

  • 控制器将充当其他包含require属性的指令的API。

  • 当用户单击元素时,链接功能用于警告shapes数组中的内容。
    我们使用jQuerybind()方法来附加点击事件。

  • 然后,我们创建" triangle"和" circle"指令,其中包含一个链接函数,该函数在形状的指令控制器中调用该方法。
    您可以将控制器作为第四个参数传递。
    在此示例中,我们使用名称shapeCtrl。
    您可以选择任何名称。

link: function (scope, element, attrs, shapeCtrl) {
	shapeCtrl.triangle();
}
  • 您可能已经在示例require:'^ shape'中注意到了这一行代码。
    该行负责指令之间的通信。
    前缀" ^"表示指令在其父级上搜索控制器。

  • 最佳实践:要向其他指令公开API时,请使用"控制器"。
    否则,使用link

指令之间的通信示例

以下部分显示了示例的完整代码,我们已在本文中对其进行了说明。
我们在此脚本文件(app.js)中定义了自定义指令和控制器。

var app = angular.module('mainApp', []);

	app.directive("shape", function() {

		return {
			restrict: "E",
			scope:{
				message:"@"
			},
			controller: function($scope) {
				$scope.shapes = [];

				this.triangle = function() {
					$scope.shapes.push("Triangle");
				};

				this.circle = function() {
					$scope.shapes.push("Circle");
				};
			},
			link: function(scope, element){
				element.bind("click", function() {
				alert(scope.shapes);
				});
			},
			template:'<button style="color:green">{{message}}</button> <br>'
		};

	});

	app.directive("triangle", function() {
		return {
			require: '^shape',
			link: function (scope, element, attrs, shapeCtrl) {
				shapeCtrl.triangle();
				}
			};
	});

	app.directive("circle", function() {
		return {
		require: '^shape',
		link: function (scope, element, attrs, shapeCtrl) {
			shapeCtrl.circle();
		}
	};
});

这是我们在此示例中用来演示指令之间的通信HTML页面。

<!DOCTYPE html>
<html>
	<head lang="en">
	<meta charset="utf-8">
	<title>AngularJS Directive Communication/title>

 	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
	<script type="text/javascript" src="app.js"></script>

	</head>
	<body>

		<div ng-app="mainApp">

			<div>

				<shape triangle circle message=" Click me to alert all Shapes"></shape>

				<shape triangle message=" Click me to alert Triangle"></shape>

				<shape circle message=" Click me to alert Circle"></shape>

			</div>

		</div>

	</body>
</html>