AngularJS讲义-控制器
在Angular中,控制器(Controller)就是基于JavaScript的构造方法,主要用来构造模型并建立模型和视图之间的数据绑定。控制器里面定义了应用程序的逻辑和行为。
通过ng-controller指令可以将控制器和DOM绑定起来。Angular会用定义过的控制器构造函数实例化一个控制器对象,在Angular应用(module)启动的时候,会创建一个根作用域, Angular实例化每个控制器时会创建一个新的子作用域并作为可注入参数($scope)注入到控制器的构造方法中.
在理解控制器作用的基础上,我们应当按照约定使用控制器:
1. 初始化$scope.
2. 在$scope中增加应用的行为。
尽量避免在如下场景中使用控制器:
1.操作DOM - 控制器主要包含业务逻辑。 把视图逻辑放到控制器中会严重影响代码的可测试性。Angular已经将绝大部分侦听器和DOM操作逻辑加以封装在数据绑定和指令(directives)中。
2. 格式化输入 - 尽量用angular form controls取代。
3. 格式化或者过滤输出 - 考虑使用Angular的过滤器(filters).
4. 实现共享代码片段,或者管理多个控制器之间的状态 - 考虑使用service组件来管理
5. 管理其他组件的生命周期(例如创建service组件实例)
初始化$scope对象的状态
但创建一个应用时,我们通常需要通过设置$scope的属性来初始化Angular $scope的状态。 这些属性(properties)包含了视图模型。$scope的属性在控制器所绑定的DOM范围内的模板(template)是可见的。
例如:
1 var myApp = angular.module('myApp',[]);
2 myApp.controller('GreetingController', ['$scope', function($scope) {
3 $scope.greeting = 'Hola!';
4 }]);
这里创建了一个'myApp'的应用模块,并定义了‘GreetingController’控制器,接下来我们通过ng-controller指令将控制器绑定到相应的div上:
<div ng-controller="GreetingController">
{{ greeting }}
</div>
这样我们就可以通过{{greeting}}表达式得到greeting属性的值。
给Scope对象赋予行为
我们可以给scope对象添加方法,这样就可以在绑定的视图或者模板中调用这些方法来响应事件或者执行一些计算任务. 让我们看下面的例子:
这段JS代码中,我们给scope添加了double方法,然后我们将控制器添加到DOM中:
这样我们就可通过表达式调用scope的double方法。正如我们在基本概念一节中讲述的, 定义在scope中的属性可以作为模型数据被绑定,同时定义在scope中的方法也可以被表达式或者ng事件指令调用,例如ngClick.
正确使用控制器
简言之,控制器中一般只包含视图相关的业务逻辑. 我们可以和视图无关的代码及公用代码封装在service中,通过在构造器中注入依赖的方式来使用services. 我们将会在稍后的章节中详解依赖注入机制.
关联控制器和Scope对象
我们可以通过ngController指令和$route service来关联控制器和Scope对象.
接下来我们通过代码范例帮助大家更好地理解Angular控制器的工作原理。我们将创建一个简单的app包含三个部分:
1. 一个模板(template) 包含了一个消息和两个按钮。
2. 一个模型(Model)包含一个名叫spice的属性。
3. 一个控制器包含了两个方法设置spice的值。
template code (index.html)
app.js(定义了控制器)
我们可以看到,模板中的消息通过表达式绑定到spice属性,spice被初始化为"very", 随后我们有通过ng-click绑定了scope中的两个方法,分别修改了spice的值, 但我们点击按钮时,消息会被自动刷新。
初始化页面:

点击Chili后, 消息自动更新:

让我们总结一下以上实例:
1. Angular通过ng-controller隐式的给模板创建了一个作用域(scope),这个作用域被SpicyController扩充。
2. SpicyController是一个普通的JavaScript函数。通常Controller名字首字母大写,以Controller为后缀。
3. 通过给$scope里面的属性赋值来创建或者更新模型。
4. Controller的方法可以直接定义为$scope的方法。
5. 可以在与控制器关联的<div>以及子元素中通过模板中的表达式以及ng事件指令访问控制器的方法和属性。
实例 二:为控制器方法添加参数, 参数可以引用model
<div ng-controller="SpicyController">
<input ng-model="customSpice">
<button ng-click="spicy('chili')">Chili</button>
<button ng-click="spicy(customSpice)">Custom spice</button>
<p>The food is {{spice}} spicy!</p>
</div>
1 var myApp = angular.module('spicyApp2', []);
3 myApp.controller('SpicyController', ['$scope', function($scope) {
4 $scope.customSpice = "wasabi";
5 $scope.spice = 'very';
7 $scope.spicy = function(spice) {
8 $scope.spice = spice;
9 };
10 }]);
11
在这个例子中我们注意到ng-click绑定的方法中添加了参数, 参数为模型spice的值, 同时输入文本框也绑定到spice属性,但在输入文本框里面键入spice的值,点击‘Custom Spice’ 按钮, message中spiced的值会被替换成文本框中的值。

实例三: 作用域的继承关系
我们可以把控制器关联到不同的DOM层级。由于ng-controller指令会自动创建子作用域,所以作用域也有相应的层级关系。子作用域中可访问上级作用域中的属性和方法,上级作用域的同名属性和方法将被子作用域隐藏。 让我们结合代码来理解:
index.html
app.css
div.spicy div { padding: 10px; border: solid 2px blue; }
app.js
1 var myApp = angular.module('scopeInheritance', []);
2 myApp.controller('MainController', ['$scope', function($scope) {
3 $scope.timeOfDay = 'morning';
4 $scope.name = 'Nikki';
5 }]);
6 myApp.controller('ChildController', ['$scope', function($scope) {
7 $scope.name = 'Mattie';
8 }]);
9 myApp.controller('GrandChildController', ['$scope', function($scope) {
10 $scope.timeOfDay = 'evening';
11 $scope.name = 'Gingerbread Baby';
12 }]);
运行结果:

我们注意到这里我们实现了三个控制器: MainController, ChildController, GrandChildController,并在不同级的div中被关联,Angular将产生四个作用域:
1. root scope即根作用域
2. MainController的作用域, 包括了timeOfDay和name属性。
3. ChildController的作用域, 继承了MainController的timeOfDay属性,覆盖了MainController的name属性。
4. GrandChildController的作用域,分别从MainController作用域继承了timeOfDay属性, 覆盖了上一层作用域的name属性。
作用域中的方法原理同上, 这里就不一一详解。
AngularJS讲义-控制器的更多相关文章
- AngularJs开发——控制器间的通信
AngularJs开发——控制器间的通信 指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制 ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
- angularjs 嵌套控制器,子控制器访问父控制器
<pre> http://www.lovelucy.info/understanding-scopes-in-angularjs.html http://blog.csdn.net/jfk ...
- angularJS中控制器和作用范围
$scope是$rootScope的子作用域控制对象,$rootScope的id为1,其他的为2,3,4... 不同的控制器之间,所对应的作用域控制对象$scope,之间是相互隔离的,如果要共享数据, ...
- AngularJS中控制器继承
本篇关注AngularJS中的控制器继承,了解属性和方法是如何被继承的. 嵌套控制器中属性是如何被继承的? ==属性值是字符串 myApp.controller("ParentCtrl&qu ...
- angularjs基础——控制器
1)当使用非空ng-app和ng-controller时,变量由angularjs控制器来处理 2)控制器接管模型变量后,直接修改模型,模版里的变量还是会自动变的 <!DOCTYPE html& ...
- angularJs 跨控制器与跨页面传值
虽然网上概括了四种或更多的传值方式,但我现在用的顺手的就两种 首先要知道AngularJs可以构建一个单页面应用程序,所以我划分为跨控制器传值 和 跨页面传值 两类 1.跨控制器传值—— $rootS ...
- AngularJS之控制器
控制器在Angularjs中的作用是增强视图,它实际就是一个函数,用来向视图中的作用域添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在页面上创建一个控制器时,Angul ...
- AngularJS:控制器
ylbtech-AngularJS:控制器 1.返回顶部 1. AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 ...
随机推荐
- phpcms评论的url替换问题
在整个项目改ip之前,评论里的url是127.0.1.113 改成localhost之后,更新了所有的url和缓存,但是v9_comment表中的url字段没有更新. 想一下后台只有一个地方是替换数据 ...
- Unity3d 扩展自定义类Inspector
public class MyClass : MonoBehaviour { public int A; // Use this for initialization void Start () { ...
- jquery checkbox 限制多选的个数
2015年11月6日 16:32:49 选中第四个的时候提示超过了3个, 点解alert框取消后, 将最后一个选中的checkbox取消选中 <script> $(document).re ...
- 使用eclipse开发的兼容性配置
通常使用eclipse开发程序的时候,正常情况下放到Linux中运行一般是没有什么问题,最明显的就是编码问题,这个一般都会统一为utf-8,另外还有Windows和Linux的换行符不同的原因,还有当 ...
- Java for LeetCode 227 Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- jsp通过s:hidden传值给后台,后台数据出现了若干逗号问题
<s:iterator value="rpActionVO.page.result" id="list" status="st"> ...
- 如何获取Iframe的页面控件的值
有时候我们在页面需要使用iframe的方法来引用另一个页面,虽然个人建议不要使用iframe哈,但是有些时候是没得法了才使用的咯,那么在使用的过程中也会遇到某一些问题,我将自己遇到的问题记录下来方便以 ...
- Javascript题库
一.填空题 JavaScript有两种引用数据类型 :__数组___.__对象__. Javascript通过__setTimeout___延迟指定时间后,去执行某程序. Javascript里Str ...
- [Android Pro] InputStream.skip方法的思考
参考 : http://blog.csdn.net/gsyzhu/article/details/8102286 在java.io.InputStream类中定义了skip这个方法.在API中的描述如 ...
- 苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推
最近使用Hbuilder 进行了HTML5开发,因为 HTML5 可以放在android 机器上,也可以放到 IOS机器上,所以很感兴趣,于是开发了一个小应用, 不过问题接着来了: 图1 如图所示:当 ...