为什么使用控制器?
控制器就像领域模型和视图的纽带,它从模型中暴露数据给视图,它给视图提供数据与服务,并且定义了所需的业务逻辑,从而将用户行为转换为模型上的变化。
一.理解基本原理
控制器是通过NG的Module.controller来创建的,它接受一个控制器名称和一个工厂函数,这个工厂函数内部有一个$scope服务,用于向视图提供作用域,我们也正是通过修改$scope来修改控制器的作用的。
Angular Directive The City is: {{city}}
The country is: {{getCountry(city) || "Unkonwn"}}
第一步:利用Module.controller方法创建了控制器,接着在视图中使用控制器ng-controller
第二步:利用$scope服务设置控制器的作用域,向视图暴露数据
第三步:在视图中双向数据绑定ng-model数据city,通过选择下拉菜单修改$scope.city的值,从而达到修改作用域的目的。
二.组织控制器
1.单块控制器
简单点,就是整个视图只是使用一个控制器。
Angular Directive Billing Zip Code
shipping Zip Code
控制器在视图中使用的两次,相应的他们虽然数据模型相同但是作用域不同,展示不可用进行通讯。
2.复用控制器
Angular Directive Billing Zip Code
shipping Zip Code
原理解析:
第一步:当Save Billing按钮被点击后,会触发setAddress(‘billingZip’, billingZip)方法,传递的值为billingZip和billingZip输入框的值(这里假设为zhang),即type : ‘billingZip’, zip : ‘zhang’
第二步:接着,$rootScope就向下级作用域发送了一个名为zipCodeUpdated的事件,且携带一个对象参数,即type : ‘billingZip’, zipCode : ‘zhang’
这时其他的局部视图就拥有了zipCodeUpdated事件的对象值
第三步:这时你再点击Copy Billing按钮,它会触发copyAddress方法,且把billingZip值赋给zip之后zip被双向绑定值了,我们可以看出来
第四步:最后点击Save Shipping按钮,就可以再次触发setAddress(‘shippingZip’, zip)事件,且传递了新的type和zip值
Angular Directive Billing Zip Code
shipping Zip Code
3.使用控制器继承,类似于类的继承
Angular Directive Top Level Controller
First Child Controller
Second Child Controller
第一步:先后定义三个控制器父类控制器topCtrl、子类控制器firstChildCtrl和secondChildCtrl。 父类中定义了反转字体顺序reverseText()方法和调整单词大小写changeCase()方法; 子类firstChildCtrl继承了父类的reverseText()方法,并且重写了changeCase()方法; 子类secondChildCtrl继承了父类的reverseText()方法,并且重写了changeCase()方法,扩展了新方法shift()
第二步:目前三个控制器还是互相独立的,我们需要使用控制器继承,只需要在父类视图中,添加子类控制器即可
NG对作用域上的数据值的继承处理方式,以及如何受ng-model影响的
读取属性值:当前作用域->父级作用域…->顶级作用域
ng-model指令修改属性值:当前作用域,如果没有,隐藏该属性
案例中,我们使用对象中添加属性,利用原型实现了共享
接下来,我们看看效果图。
4.使用多个控制器
很简单,前面我们已经使用过了!
Angular Directive First Child Controller
Second Child Controller
5.使用无作用域的控制器
当你的作用域不需要复杂、没错继承的好处的必要、不需要控制器之间的通讯,那么可以使用无作用域的控制器。
Angular Directive Top Level Controller
6.显示更新作用域
将AngularJS与另外的JS框架集成起来,例如我们将要说到的jQuery UI,我们将实现两个框架作用域的通讯,NG给出了三个方法:
Angular Directive AngularJS
Click Count : {{clickCounter || "0"}}JQuery UI
单击NG中的复选框控制JQ中button是否禁用,单击JQ中的button使得NG中的click count递增,当然,单击NG中的click count也递增。
附:
AngularJS知识库:http://lib.csdn.net/base/23
AngularJS地址:https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular-route.js,其它版本或模块修改URL即可获得。
文章来源:http://blog.csdn.net/super_yang_android/article/details/51627272