下面以一个例子来讲述 angular 中的event system,有$emit(), $on(), $broadcast().效果图如下
下面的代码中,用到了 controller AS 的语法,具体这种语法的使用情况,好处或是与 原来 直接在 Controller中把视图对象直接绑定到 $scope 对象上面的区别,
可以查看我之前的一片博文。
直接贴代码
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/custom.css" />
</head>
<body ng-app="app"> <div class="container" ng-controller="AccountController as vm">
<div class="header clearfix">
<nav>
<ul class="nav nav-pills pull-right">
<li role="presentation">
<span>Current Balance: {{ vm.accountBalance | currency }}</span>
</li>
</ul>
</nav>
<h3 class="text-muted">Account Controller</h3>
<h5>dispatches event <b>WithdrawalNotAllowed</b> downwards to Child Controllers using <b>$broadcast</b></h5> </div>
<div class="row">
<div class="col-lg-6" ng-controller="DepositController as t">
<h3>Deposit Controller</h3>
<h5>dispatches event <b>AmountDeposited</b> upwards to AccountController using <b>$emit</b></h5>
<p>
<input type="text" class="form-control" ng-model="t.amount" />
</p>
<p>
<input type="button" class="btn btn-primary btn-sm" value="Deposit" ng-click="t.deposit()" />
</p>
</div> <div class="col-lg-6" ng-controller="WithdrawController as vm">
<h3>Withdraw Controller</h3>
<h5>dispatches event <b>AmountWithdrawn</b> upwards to AccountController using <b>$emit</b></h5>
<p>
<input type="text" class="form-control" ng-model="vm.amount" />
<span class="error" ng-if="vm.validationError">{{vm.validationError}}</span>
</p>
<p>
<input type="button" class="btn btn-primary btn-sm" value="Withdraw" ng-click="vm.withdraw()" />
</p>
</div>
</div> </div> <!--<script type="text/javascript" src="js/jquery.min.js"></script>-->
<!--<script type="text/javascript" src="js/bootstrap.min.js"></script>-->
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/custom.js"></script>
<script type="text/javascript" src="app/app.js"></script>
</body>
</html>
(function(){
'use strict';
angular.module('app', [])
.controller('AccountController', function($scope){
var vm = this;
vm.accountBalance = 0;
vm.activate = _activate; function _activate(){
$scope.$on("AmountDeposited", _amountDepositedHandler);
$scope.$on('AmountWithdrawn', _amountWithdrawnHandler);
}
function _amountDepositedHandler(event, args){
vm.accountBalance += eval(args.amount);
}
function _amountWithdrawnHandler(event, args) {
if (vm.accountBalance - eval(args.amount) < 0) {
$scope.$broadcast("WithdrawalNotAllowed", {balance: vm.accountBalance});
}
else {
vm.accountBalance -= eval(args.amount);
}
}
_activate();
})
.controller('DepositController', function($scope){ var vm = this;
vm.amount = 0;
vm.deposit = _deposit;
$scope.name = 'ysr';
function _deposit() {
alert(this.name);
$scope.$emit("AmountDeposited", {amount: vm.amount});
vm.amount = 0;
}
console.log(this);
})
.controller('WithdrawController', function($scope){
var vm = this;
vm.amount = 0;
vm.validationError = "";
vm.activate = _activate;
vm.withdraw = _withdraw; function _activate() {
$scope.$on("WithdrawalNotAllowed", _withdrawalNotAllowedHandler);
} function _withdraw() {
vm.validationError = "";
$scope.$emit("AmountWithdrawn", {amount: vm.amount});
vm.amount = 0;
} function _withdrawalNotAllowedHandler(event, args) {
vm.validationError = "You cannot withdraw more than $" + args.balance;
} _activate();
}); })();
/*(function () {
'use strict'; angular
.module('app', [])
.controller('AccountController', AccountController)
.controller('DepositController', DepositController)
.controller('WithdrawController', WithdrawController); AccountController.$inject = ['$scope'];
function AccountController($scope) {
var vm = this;
vm.accountBalance = 0;
vm.activate = _activate; function _activate() {
$scope.$on("AmountDeposited", _amountDepositedHandler);
$scope.$on("AmountWithdrawn", _amountWithdrawnHandler);
} function _amountDepositedHandler(event, args) {
vm.accountBalance += eval(args.amount);
} function _amountWithdrawnHandler(event, args) {
if (vm.accountBalance - eval(args.amount) < 0) {
$scope.$broadcast("WithdrawalNotAllowed", {balance: vm.accountBalance});
}
else {
vm.accountBalance -= eval(args.amount);
}
} _activate();
} DepositController.$inject = ['$scope'];
function DepositController($scope) {
var vm = this;
vm.amount = 0;
vm.deposit = _deposit; function _deposit() {
$scope.$emit("AmountDeposited", {amount: vm.amount});
vm.amount = 0;
}
} WithdrawController.$inject = ['$scope'];
function WithdrawController($scope) {
var vm = this;
vm.amount = 0;
vm.validationError = "";
vm.activate = _activate;
vm.withdraw = _withdraw; function _activate() {
$scope.$on("WithdrawalNotAllowed", _withdrawalNotAllowedHandler);
} function _withdraw() {
vm.validationError = "";
$scope.$emit("AmountWithdrawn", {amount: vm.amount});
vm.amount = 0;
} function _withdrawalNotAllowedHandler(event, args) {
vm.validationError = "You cannot withdraw more than $" + args.balance;
} _activate();
}
})();*/