AngularJs学习第五篇从Controller控制器谈谈$scope作用域


Posted in Javascript onJune 08, 2016

Controller的创建

AngularJs controller使用无处不在,在里代码演示比较简单的创建工作。

<!DOCTYPE html>
<html xmlns="http://www.w.org//xhtml" ng-app="exampleApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-"/>
<title>App</title>
<script src="angular.js"></script>
<link href="bootstrap-theme.css" rel="stylesheet" />
<link href="bootstrap.css" rel="stylesheet" />
<script>
angular.module("exampleApp", [])
.controller("defaultCtrl", function ($scope) {
$scope.setInput = function (value) {
console.log("print:" + value);
}
});
</script>
</head>
<body ng-controller="defaultCtrl"> 
<div class="well">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="setInput(value)">Click</button>
</div>
</div>
</body>
</html>

在这控制很简单,首先我在html 中添加了 ng-app 属性,表示module的作用范围。

在 body 中添加了 ng-controller 表示 defaultCtrl 控制器的作用范围。

input 便签中ng-model 指令的是绑定数据,双向数据绑定(MVVM)。

$scope 是AngularJs内置的作用域。

此实例的只是把输入的值打印到控制台中,如图:

AngularJs学习第五篇从Controller控制器谈谈$scope作用域

仅此而已,简单吧。

多个控制器controller作用域问题

现在我们来改造下程序,

<body >
<div class="well" ng-controller="defaultCtrl">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="setInput(value)">Click</button>
</div>
</div>
<div class="well" ng-controller="defaultCtrl">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="setInput(value)">Click</button>
</div>
</div>
</body>

其余代码不变,我只是把放到body 中的属性 ng-controller 放到了两个div中。我重用了defaultCtrl控制器,猜想下,如果我在第一个input标签输入内容,我点击第二个控制器的button按钮,会出现你所期望的结果吗?

AngularJs学习第五篇从Controller控制器谈谈$scope作用域

结果是否和你想你的一样呢,大家可以看到这个结果为undefined. 在个很好解释,应为他们的作用域不同,虽然你重复使用了统一控制器,但是在创建作用域确实不同的。

调用的工厂函数会返回不同的作用域。

那么如何进行不同作用域之间的访问呢,在Angularjs中对于作用域访问有个$rootScope 。

在这里有三个函数需要介绍下,

$on(name,handler) 注册一个事件处理函数,该函数在特定的事件被当前作用域收到时将被调用。

$emit(name,args) 向当前父作用域发送一个事件,直至根作用域。

$broadcast(name,args) 向当前作用域下的子作用域发送一个事件,参数是事件名称以及一个用于作用向事件提供额外数据的对象。

现在来更改下代码:

<script>
angular.module("exampleApp", [])
.controller("defaultCtrl", function ($scope,$rootScope) {
$scope.$on("UpdateValue", function (event, args) {
$scope.input = args.zip;
});
$scope.setInput = function (value) {
$rootScope.$broadcast("UpdateValue", { zip: value });
console.log("print:" + $scope.input);
}
$scope.copy = function () {
console.log("copy:" + $scope.input);
};
});
</script> 
<div class="well" ng-controller="defaultCtrl">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="copy()">Copy</button>
</div>
</div>

在段代码中我添加了几个函数,同时改变了第二个控制器的函数。

结果:

AngularJs学习第五篇从Controller控制器谈谈$scope作用域

确实发生了。

controller继承

<script>
angular.module("exampleApp", [])
.controller("defaultCtrl", function ($scope, $rootScope) {
//$scope.$on("UpdateValue", function (event, args) {
// $scope.input = args.zip;
//});
$scope.setInput = function (value) {
//$rootScope.$broadcast("UpdateValue", { zip: value });
$scope.input = value;
console.log("print:" + $scope.input);
}
$scope.copy = function () {
console.log("copy:" + $scope.input);
};
})
.controller("simpleCtrl", function ($scope) {
$scope.copy = function () {
console.log("copy:" + $scope.input);
};
});
</script>
<body ng-controller="defaultCtrl">
<div class="well">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="setInput(value)">Click</button>
</div>
</div>
<div class="well" ng-controller="simpleCtrl">
<h>Count</h>
<div class="form-group">
<input class="form-control" required ng-model="value" />
<button ng-click="copy()">Copy</button>
</div>
</div>
</body>

我添加了一个控制器,simpleCtrl 仔细观察下,发现defaultCtrl 包含了simpleCtrl 中,所以作用simple 也继承 了。

结果图:发下我在第一个窗中输入时,第二个也变了,应为都是同一个value。

AngularJs学习第五篇从Controller控制器谈谈$scope作用域

$scope 作用域问题,在使用controller时 要明白其作用域。

Javascript 相关文章推荐
jquery 图片 上一张 下一张 链接效果(续篇)
Apr 20 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
Jan 17 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 Javascript
javascript 判断整数方法分享
Dec 16 Javascript
javascript模块化简单解析
Apr 07 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
JS实现快递单打印功能【推荐】
Jun 21 Javascript
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
微信小程序实现登录注册功能
Dec 29 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
Jun 08 #Javascript
玩转JavaScript OOP - 类的实现详解
Jun 08 #Javascript
Javascript之String对象详解
Jun 08 #Javascript
浅谈JavaScript函数的四种存在形态
Jun 08 #Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 #Javascript
关于session和cookie的简单理解
Jun 08 #Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 #Javascript
You might like
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
GWebs公司笔试题
2012/05/04 面试题
教师实习的自我鉴定
2013/10/26 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
婚礼答谢礼品
2015/01/20 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
小学运动会宣传稿
2015/07/23 职场文书
hive数据仓库新增字段方法
2022/06/25 数据库