详解AngularJS控制器的使用


Posted in Javascript onMarch 09, 2016

控制器在Angularjs中的作用是增强视图,它实际就是一个函数,用来向视图中的作用域添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为。

当我们在页面上创建一个控制器时,Angularjs会生成并传递一个$scope给这个控制器,由于Angularjs会自动实例化控制器,所以我们只需要写构造函数即可。下面的例子展示了控制器初始化:

function my Controller($scope){
 $scope.msg="hello,world!"; 
}

上面这个创建控制器的方法会污染全局命名空间,更合理的办法是创建一个模块,然后在模块中创建控制器,如下:

var myApp=angular.module("myApp",[]);
myApp.controller("myController",function($scope){
 $scope.msg="hello,world!";
})

用内置指令ng-click可以将按钮、链接等其他任何DOM元素同点击事件进行绑定。ng-click指令将浏览器中的mouseup事件,同设置在DOM元素上的事件处理程序绑定在一起(例如,当浏览器在某个DOM元素上触发了点击事件,函数就会被调用)。和前面的例子类似,绑定看起来是这样的:

<div ng-controller="FirstController">
<h4>The simplest adding machine ever</h4>
<button ng-click="add(1)" class="button">Add</button>
<a ng-click="subtract(1)" class="button alert">Subtract</a>
<h4>Current count: {{ counter }}</h4>
</div>

按钮和链接都被绑定在了内部$scope的一个操作上,当点击任何一个元素时AngularJS都会调用相应的方法。注意,当设置调用哪个函数时,会同时用括号传递一个参数(add(1))

app.controller('FirstController', function($scope) {
$scope.counter = 0;
$scope.add = function(amount) { $scope.counter += amount; };
$scope.subtract = function(amount) { $scope.counter -= amount; };
});

Angularjs与其他框架的最大区别在于,控制器并不适合来执行DOM操作、格式化或数据操作,以及除存储数据模型之外的状态维护操作,它只是视图和$scope之间的桥梁。

控制器嵌套(作用域包含作用域)

AngularJS应用的任何一个部分,无论它渲染在哪个上下文中,都有父级作用域存在。对于ng-app所处的层级来讲,它的父级作用域就是$rootScope。

默认情况下,AngularJS在当前作用域中无法找到某个属性时,便会在父级作用域中进行查找。如果AngularJS找不到对应的属性,会顺着父级作用域一直向上寻找,直到抵达$rootScope为止。如果在$rootScope中也找不到,程序会继续运行,但视图无法更新。

通过例子来看一下这个行为。创建一个ParentController,其中包含一个user对象,再创建一个ChildController来引用这个对象:

app.controller('ParentController', function($scope) {
$scope.person = {greeted: false};
});
app.controller('ChildController', function($scope) {
$scope.sayHello = function() {
$scope.person.name = 'Ari Lerner';
};
});

如果我们将ChildController置于ParentController内部,那ChildController的$scope对象的父级作用域就是ParentController的$scope对象。根据原型继承的机制,我们可以在子作用域中访问ParentController的$scope对象。

<div ng-controller="ParentController">
<div ng-controller="ChildController">
<a ng-click="sayHello()">Say hello</a>
</div>
{{ person }}
</div>

以上就是本文的全部内容,希望对大家的学习有所帮助,帮助大家熟悉AngularJS控制器。

Javascript 相关文章推荐
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 Javascript
js闭包的用途详解
Nov 09 Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 Javascript
javascript实现删除前弹出确认框
Jun 04 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
AngularJs验证重复密码的方法(两种)
Nov 25 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
JS数组中对象去重操作示例
Jun 04 Javascript
vue路由缓存的几种实现方式小结
Feb 02 Javascript
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
JQuery Mobile实现导航栏和页脚
Mar 09 #Javascript
javascript基本算法汇总
Mar 09 #Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 #Javascript
javascript获取wx.config内部字段解决微信分享
Mar 09 #Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
Mar 09 #Javascript
jquery实现文本框textarea自适应高度
Mar 09 #Javascript
分享12个实用的jQuery代码片段
Mar 09 #Javascript
You might like
文件上传程序的全部源码
2006/10/09 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
Python实现的弹球小游戏示例
2017/08/01 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
如何基于python实现脚本加密
2019/12/28 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
工作态度不端正检讨书
2014/10/04 职场文书
法定代表人免职证明
2015/06/24 职场文书
nginx请求限制配置方法
2021/07/09 Servers