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 相关文章推荐
JavaScript 学习笔记(九)call和apply方法
Jan 11 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
使用堆实现Top K算法(JS实现)
Dec 25 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
vue中使用localstorage来存储页面信息
Nov 04 Javascript
JS实现DOM删除节点操作示例
Apr 04 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
Jan 21 Javascript
vue中img src 动态加载本地json的图片路径写法
Apr 25 Javascript
vue路由传参的基本实现方式小结【三种方式】
Feb 05 Javascript
原生js实现贪吃蛇游戏
Oct 26 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
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
职高毕业生自我鉴定
2013/10/21 职场文书
党员的自我评价范文
2014/01/02 职场文书
致共产党员倡议书
2014/04/16 职场文书
食品安全处置方案
2014/06/14 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
离婚上诉状范文
2015/05/23 职场文书
工程主管竞聘书
2015/09/15 职场文书
在Python中如何使用yield
2021/06/07 Python
go goroutine 怎样进行错误处理
2021/07/16 Golang
解决Redis启动警告问题
2022/02/24 Redis
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS