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 相关文章推荐
js获取本机操作系统类型的两种方法
Dec 19 Javascript
Node.js模块封装及使用方法
Mar 06 Javascript
微信开发 消息推送实现代码
Oct 21 Javascript
jQuery无缝轮播图代码
Dec 22 Javascript
Vue自定义指令使用方法详解
Aug 21 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
Jun 21 Javascript
vue项目中实现缓存的最佳方案详解
Jul 11 Javascript
js实现简单的打印表格
Jan 15 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 Javascript
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 Vue.js
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
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
JQuery从头学起第一讲
2010/07/04 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
python处理中文编码和判断编码示例
2014/02/26 Python
使用Python脚本操作MongoDB的教程
2015/04/16 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python按照多个条件排序的方法
2019/02/08 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python机器人运动范围问题的解答
2019/04/29 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
艺术用品:Arteza
2018/11/25 全球购物
小学生十佳少年事迹材料
2014/08/20 职场文书
催款通知书范文
2015/04/17 职场文书
聚会通知怎么写
2015/04/23 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL