AngularJS精妙绝伦的控制器

阅读更多

为什么使用控制器? 

        控制器就像领域模型和视图的纽带,它从模型中暴露数据给视图,它给视图提供数据与服务,并且定义了所需的业务逻辑,从而将用户行为转换为模型上的变化。

 

一.理解基本原理

        控制器是通过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的值,从而达到修改作用域的目的。 

AngularJS精妙绝伦的控制器_第1张图片

 

二.组织控制器 

1.单块控制器

        简单点,就是整个视图只是使用一个控制器。





    Angular Directive
    
    
    
	
    
    



Billing Zip Code

shipping Zip Code

        控制器在视图中使用的两次,相应的他们虽然数据模型相同但是作用域不同,展示不可用进行通讯。

AngularJS精妙绝伦的控制器_第2张图片
        接下来,我们要跨作用域实现通信。

 

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值

AngularJS精妙绝伦的控制器_第3张图片
        同时,我们还可以使用服务来调节作用域事件。





    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() 

        第二步:目前三个控制器还是互相独立的,我们需要使用控制器继承,只需要在父类视图中,添加子类控制器即可

AngularJS精妙绝伦的控制器_第4张图片
注意: 

        NG对作用域上的数据值的继承处理方式,以及如何受ng-model影响的

        读取属性值:当前作用域->父级作用域…->顶级作用域 

        ng-model指令修改属性值:当前作用域,如果没有,隐藏该属性 

        案例中,我们使用对象中添加属性,利用原型实现了共享 

        接下来,我们看看效果图。

AngularJS精妙绝伦的控制器_第5张图片
        

4.使用多个控制器 

        很简单,前面我们已经使用过了!





    Angular Directive
    
    
    
    


First Child Controller

Second Child Controller

 

5.使用无作用域的控制器 

        当你的作用域不需要复杂、没错继承的好处的必要、不需要控制器之间的通讯,那么可以使用无作用域的控制器。





    Angular Directive
    
    
    
    



Top Level Controller

AngularJS精妙绝伦的控制器_第6张图片

6.显示更新作用域 

        将AngularJS与另外的JS框架集成起来,例如我们将要说到的jQuery UI,我们将实现两个框架作用域的通讯,NG给出了三个方法:

AngularJS精妙绝伦的控制器_第7张图片
        什么意思呢?我们将在案例中详解。

 





    Angular Directive
    
    
    
	
	
	
    



AngularJS

Click Count : {{clickCounter || "0"}}

JQuery UI

        单击NG中的复选框控制JQ中button是否禁用,单击JQ中的button使得NG中的click count递增,当然,单击NG中的click count也递增。

AngularJS精妙绝伦的控制器_第8张图片

 

附:

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

  • AngularJS精妙绝伦的控制器_第9张图片
  • 大小: 8.7 KB
  • AngularJS精妙绝伦的控制器_第10张图片
  • 大小: 39.7 KB
  • AngularJS精妙绝伦的控制器_第11张图片
  • 大小: 37.7 KB
  • AngularJS精妙绝伦的控制器_第12张图片
  • 大小: 11 KB
  • AngularJS精妙绝伦的控制器_第13张图片
  • 大小: 19.5 KB
  • AngularJS精妙绝伦的控制器_第14张图片
  • 大小: 4.3 KB
  • AngularJS精妙绝伦的控制器_第15张图片
  • 大小: 35.3 KB
  • AngularJS精妙绝伦的控制器_第16张图片
  • 大小: 8.2 KB
  • code.zip (192.5 KB)
  • 下载次数: 0
  • 查看图片附件

你可能感兴趣的:(AngularJS,控制器,controller)