控制器的作用
- 1. 为应用中的模型设置初始状态,和ng-init作用一样
- 2.通过$scope对象把数据模型和函数暴露给视图
- 3.监视模型其余部分的变化,并采取相应的动作。
从前面的例子中大家已经注意到了控制器是绑定在特定的DOM片段上的,这些片段就是它们 需要负责管理的内容,我们有两张方法绑定到DOM节点上。
- 1.在模板中通过ng-controller属性声明到DOM节点上
- 2.通过路由动态绑定到DOM节点上(这个在后面将会阐述)
-
1 <!DOCTYPE html> 2 <html ng-app=""> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 </head> 7 <body ng-controller="myCtrl"> 8 <p>{{greet.text}},World</p> 9 <script src="js/angular-1.2.16.js"></script> 10 <script> 11 function myCtrl($scope) 12 { 13 $scope.greet = { text: "Hello" }; 14 } 15 </script> 16 </body> 17 </html>
通过上面的例子我们可以发现控制器和js中的方法没有什么区别,只是多了一个参数$scope.
$scope
$scope是什么
$scope,在前面的几节中我们说在表达式中读取变量,而实际上表达式里读取的变量叫做属性 更为确切,所谓的变量其实是$scope对象的一个属性,即$scope是表达式的上下文。我们可以在$scope对象作用域范围内对其 属性进行操作。
$scope的层次结构
每个angular应用有且只用一个rootScope,但可以拥有多个child scope。
一个应用可以有多个作用域,因为一些指定会生成新的作用域(如ng-repeat),当新的作用域被创建,他们将会被作为一个 child scope就会添加到父作用域,这样,创建了一个与它们附属的DOM相似的树结构。
当angular对表达式{{expression}}求值时,它首先查看与当前元素关联的scope属性,如果没有找到,她将会一直向上寻找 parent scope直到找到rootScope,在Javascript这种行为被称为“原型继承”。
$scope的函数$watch
$scope内置有很多函数,使用最多的是$watch函数,当你的数据模型中的某一部分发生变化,$watch函数可以 向你发出通知,他的函数签名为
$watch(watchFn,watchAction,deepWatch)这个函数返回一个函数,用来注销监控。
接下来我们看个小例子。
1 <!DOCTYPE html> 2 <html ng-app=""> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 </head> 7 <body ng-controller="myCtrl"> 8 <input type="text" ng-model="num" /> 9 <p>{{price}}</p> 10 <script src="js/angular-1.2.16.js"></script> 11 <script> 12 function myCtrl( $scope ) 13 { 14 $scope.num = 10; 15 $scope.price = 0; 16 function callBack( newVal, oldVal, scope ) 17 { 18 $scope.price = newVal > 100 ? 10 : 0; 19 } 20 $scope.$watch("num", callBack ) 21 } 22 </script> 23 </body> 24 </html>
这里我们监控了input的输入值,如果大于100就把p显示为10
这里watchFn是一个带有Angular表达式,watchFn可以是一个带有Angular表达式或者函数的字符串, 它会返回被监控的数据模型的当前值。它会被执行很多次,所以你要保证它不会产生其他副作用。
watchAction是一个函数或者表达式,当watchFn被调用时,如果是函数的形式,它将会接收到watchFn 新旧两个值,以及作用域对象的引用。function(newValue,oldValue,scope)
deepWatch,这是一个可选的布尔类型参数,如果监控的不是一个简单的值,就可以使用这个参数,angular 会去遍历数组或者对象。
$scope的生命周期
- 1.创建 ——根作用域是在应用被$injector启动时创建的。在模板链接阶段,有些指令会创建新的子作用域。