何时在$scope.$on
上使用$scope.emit
和angular
?我想了解更多关于在角度和使用事件聚合中正确使用此函数的信息。
答案 0 :(得分:16)
AgularJS为控制器之间基于事件的通信提供$ on,$ emit和$ broadcast服务。
它通过范围层次结构向上调度事件名称,并通知已注册的$rootScope.Scope
侦听器。事件生命周期从调用$ emit的范围开始。事件向上遍历根范围并沿途调用所有已注册的侦听器。如果其中一个侦听器取消它,该事件将停止传播。
<!DOCTYPE html>
<html>
<head>
<title>Broadcasting</title>
<script src="lib/angular.js"></script>
<script>
var app = angular.module('app', []);
app.controller("firstCtrl", function ($scope) {
$scope.$on('eventName', function (event, args) {
$scope.message = args.message;
console.log($scope.message);
});
});
app.controller("secondCtrl", function ($scope) {
$scope.handleClick = function (msg) {
$scope.$emit('eventName', { message: msg });
};
});
</script>
</head>
<body ng-app="app">
<div ng-controller="firstCtrl" style="border:2px solid #E75D5C; padding:5px;">
<h1>Parent Controller</h1>
<p>Emit Message : {{message}}</p>
<br />
<div ng-controller="secondCtrl" style="border:2px solid #428bca;padding:5px;">
<h1>Child Controller</h1>
<input ng-model="msg">
<button ng-click="handleClick(msg);">Emit</button>
</div>
</div>
</body>
</html>
将事件名称向下调度到所有子范围(及其子级),并通知已注册的$rootScope.Scope
侦听器。事件生命周期从调用$ broadcast的范围开始。此范围内事件的所有侦听器都会收到通知。之后,事件向下遍历子范围,并在此过程中调用所有已注册的侦听器。该活动无法取消。
<!DOCTYPE html>
<html>
<head>
<title>Broadcasting</title>
<script src="lib/angular.js"></script>
<script>
var app = angular.module('app', []);
app.controller("firstCtrl", function ($scope) {
$scope.handleClick = function (msg) {
$scope.$broadcast('eventName', { message: msg });
};
});
app.controller("secondCtrl", function ($scope) {
$scope.$on('eventName', function (event, args) {
$scope.message = args.message;
console.log($scope.message);
});
});
</script>
</head>
<body ng-app="app">
<div ng-controller="firstCtrl" style="border:2px solid #E75D5C; padding:5px;">
<h1>Parent Controller</h1>
<input ng-model="msg">
<button ng-click="handleClick(msg);">Broadcast</button>
<br /><br />
<div ng-controller="secondCtrl" style="border:2px solid #428bca;padding:5px;">
<h1>Child Controller</h1>
<p>Broadcast Message : {{message}}</p>
</div>
</div>
</body>
</html>
它监听给定类型的事件。它可以捕获由$broadcast
和$emit.
如果您的范围之间没有父子关系,您可以将$ rootScope注入控制器并将事件广播到所有子范围,但您无法发出事件。
$emit
只能为所有$rootScope.$on
个侦听器触发事件。