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 相关文章推荐
键盘控制事件应用教程大全
Nov 24 Javascript
jQuery autocomplete插件修改
Apr 17 Javascript
JQuery Easyui Tree的oncheck事件实现代码
May 28 Javascript
JavaScript中的null和undefined解析
Apr 14 Javascript
简单的代码实现jquery定时器
Jan 03 Javascript
SeaJS入门教程系列之使用SeaJS(二)
Mar 03 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
实例详解jQuery结合GridView控件的使用方法
Jan 04 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
May 31 Javascript
15个顶级开源JavaScript框架和库
Oct 10 Javascript
js删除数组中某几项的方法总结
Jan 16 Javascript
js实现3D旋转效果
Aug 18 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
二招解决php乱码问题
2012/03/25 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
调试php程序的简单步骤
2019/10/04 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
python 经典数字滤波实例
2019/12/16 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
质检部岗位职责
2013/11/11 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
出纳工作检讨书
2014/10/18 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
城管个人总结
2015/02/28 职场文书
通知书大全
2015/04/27 职场文书
债务追讨律师函
2015/06/24 职场文书