(七)Angularjs - 控制器

控制器的作用

没有控制器/controller,我们没有地方定义业务模型

比如:ng-init指令。我们可以使用ng-init指令在scope对象上定义数据

<div ng-init="sb={name:'somebody',gender:'male',age:28}">

</div>

控制器让我们有机会在scope上定义我们的业务逻辑,具体说,可以使用控制器:

•对scope对象进行初始化

•向scope对象添加方法

 

在模板中声明控制器

在一个HTML元素上使用ng-controller指令,就可以引入一个控制器对象:

<div ng-controller="myController">...</div>

 

控制器的实现

控制器实际上就是一个JavaScript的类/构造函数:

 1 //控制器类定义

 2 var myControllerClass = function($scope){

 3     //模型属性定义

 4     $scope.text = "...";

 5     //模型方法定义

 6     $scope.do = function(){...};

 7 };

 8 //在模块中注册控制器

 9 angular.module('someModule',[])

10 .controller("myController",myControllerClass);

 

控制器对scope的作用

注意:ng-controller指令总是创建一个新的scope对象:

流程:

•ng-app指令引发$rootScope对象的创建。开始时,它是一个空对象。

•body元素对应的scope对象还是$rootScope。ng-init指令将sb对象挂在了$rootScope上。

•div元素通过ng-controller指令创建了一个新的scope对象,这个对象的原型是$rootScope。

•因为原型继承的关系,在do函数中对sb的引用指向$rootScope.sb。

 

初始化$scope对象

<html ng-app="test">

<head>

    <script src="angular.js"></script>

</head>

<body>

    <div ng-controller="testController">

        <div>name : {{vm.sb.name}}</div>

        <div>gender : {{vm.sb.gender}}</div>

        <div>age : {{vm.sb.age}}</div>

        <div>career : {{vm.sb.career}}</div>

        <div><img ng-src="{{vm.sb.photo}}"></div>

    </div>

</body>

</html>
 1 var testControllerClass = function($scope){

 2     //view model

 3     $scope.vm = {

 4         sb : {

 5             name : "Jason Stantham",

 6             gender : "male",

 7             age : 48,

 8             career : "actor",

 9             photo : "http:1.jpg"

10         }

11     };

12 };

13 angular.module("ezstuff",[])

14 .controller("testController",testControllerClass);

 

向scope对象添加方法

<html ng-app="test">

<head>

    <script src="angular.js"></script>

</head>

<body>

    <div ng-controller="testController">

        <button ng-click="vm.shuffle();">shuffle</button>

        <div>name : {{vm.sb.name}}</div>

        <div>gender : {{vm.sb.gender}}</div>

        <div>age : {{vm.sb.age}}</div>

        <div>career : {{vm.sb.career}}</div>

        <div><img ng-src="{{vm.sb.photo}}"></div>

    </div>

</body>

</html>
 1 var testControllerClass = function($scope){

 2     //view model

 3     $scope.vm = {

 4         sb : {

 5             name : "Jason Stantham",

 6             gender : "male",

 7             age : 48,

 8             career : "actor",

 9             photo : "1.jpg"

10         },

11         shuffle : function(){

12                 var repo = [

13                     {name:"Jason Stantham",gender:"male",age:48,career:"actor",photo:"2.jpg"},

14                     {name:"Jessica Alba",gender:"female",age:32,career:"actress",photo:"4.jpg"},

15                     {name:"Nicolas Cage",gender:"male",age:53,career:"actor",photo:"4.jpg"},

16                     {name:"崔永元",gender:"male",age:48,career:"independent journalist",photo:"5.jpg"}];

17                 var idx = Math.floor(Math.random()*repo.length);

18                 $scope.vm.sb = repo[idx];

19         }

20     };

21 };

22 angular.module("test",[])

23 .controller("testController",testControllerClass );

 

控制器不要以下操作

•DOM操作:应当将DOM操作使用指令/directive进行封装。

•变换输出形式:应当使用过滤器/filter对输出显示进行转化。

•跨控制器共享代码:对于需要复用的基础代码,应当使用服务/service进行封装

你可能感兴趣的:(AngularJS)