AngularJS 1.x系列:AngularJS控制器(3)

1. 控制器(Controller)定义

  控制器(Controller)在AngularJS中作用是增强视图(View),AngularJS控制器是一个构造方法,用来向视图(View)中添加额外功能。

  ng-controller指令定义AngularJS应用程序控制器。

  控制器是JavaScript对象,由标准的JavaScript对象的构造函数创建。

  当控制器通过ng-controller指令被添加到DOM页面时,AngularJS会通过控制器构造函数生成一个对象。

  在生成构造函数对象过程中,$scope对象作为参数注入其中,并允许访问$scope对象。

  通过$scope对象与页面中的元素进行数据绑定,实现数据从控制器(Controller)到视图(View)的过程。

2. 控制器初始化$scope对象

  控制器(Controller)的作用是操作$scope对象,具体表现在:

  ◊ 初始化$scope对象

  ◊ 为$scope对象添加自定义实现

  $scope对象可以看作是由控制器(Controller)封装后的ViewModel。

2.1 初始化$scope对象

  示例代码:

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("HelloCtrl", function($scope){
                $scope.text = "Hello World!";
            });
        </script>
    </head>
    <body>
        <div ng-controller="HelloCtrl">
            <div ng-bind="text"></div>
        </div>
    </body>
</html>

2.2 为$scope对象添加自定义方法

  示例代码:

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("HelloCtrl", function($scope){
                $scope.text = "Hello World!";
                $scope.getText = function(){
                    $scope.text = "Hello AngularJS!";
                    return $scope.text;
                };
            });
        </script>
    </head>
    <body>
        <div ng-controller="HelloCtrl">
            <div ng-bind="text"></div>
            <input type="button" value="ChangeText" ng-click="getText()" />
        </div>
    </body>
</html>

2.3 为$scope对象添加带参数方法

  示例代码:

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("HelloCtrl", ["$scope", function($scope){
                $scope.text = "Hello World!";
                $scope.getText = function(){
                    $scope.text = "Hello AngularJS!";
                    return $scope.text;
                };
                $scope.setText = function(param){
                    $scope.text = param;
                };
            }]);
        </script>
    </head>
    <body>
        <div ng-controller="HelloCtrl">
            <div ng-bind="text"></div>
            <input type="button" value="ChangeText" ng-click="setText('Hello AngularJS!')" />
        </div>
    </body>
</html>

  $scope对象方法多个参数之间逗号(,)隔开

2.4 $scope对象属性和方法的继承

  AngularJS中的“ng-controller”指令允许在不同层次元素中指定控制器,处于内层控制器中的$scope对象将会自动继承外层控制器中的$scope对象的属性和方法。

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("ParentCtrl", ["$scope", function($scope){
                $scope.text = "Text";
            }]);
            app.controller("ChildCtrl", ["$scope", function($scope){
                $scope.child_text = "Child Text";
            }]);
        </script>
    </head>
    <body>
        <div ng-controller="ParentCtrl">
            <div ng-bind="text"></div>
            <div ng-controller="ChildCtrl">
                <div ng-bind="child_text"></div>
            </div>
        </div>
    </body>
</html>

3. 作用域(Scope)

  作用域(scope)是构成AngularJS应用的核心基础,AngularJS将$scope设计成和DOM类似的结构,$scope可以进行嵌套,可以引用父级$scope中的属性和方法。

3.1 $rootScope

  AngularJS启动并生成视图时,会将根ng-app元素同$rootScope进行绑定。$rootScope是所有$scope对象的最上层。

  $rootScope是AngularJS中最接近全局作用域的对象,不建议在$rootScope上绑定太多业务逻

  所有的应用都有一个$rootScope,可以作用在ng-app指令包含的所有HTML元素中。

  $rootScope可作用于整个应用中。在$rootscope中定义的属性及方法,可以在各个controller的$scope中使用。 

  示例代码:

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.run(["$rootScope", function($rootScope){
                $rootScope.text = "Hello AngularJS!";
            }]);
        </script>
    </head>
    <body>
        {{ text }}
    </body>
</html>

3.2 $scope

  AngularJS中$scope对象作为数据模型,自定义属性和方法,可以在控制器(Controller)和视图(View)中使用。

  $scope对象的生命周期处理有四个不同阶段:

  1>.创建

  在创建控制器(Controller)或指令时,AngularJS会用$injector创建一个新的作用域($scope),并在这个新建的控制器(Controller)或指令运行时注入作用域($scope)。

  2>.链接

  当Angular开始运行时,所有的$scope对象都会附加或者链接到视图中。

  所有创建$scope对象的函数也会将自身附加到视图中。

  这些作用域将会注册当Angular应用上下文中发生变化时需要运行的$watch函数。

  3>.更新

  当事件循环运行时,它通常执行在顶层$scope对象上(被称作$rootScope),每个子作用域都执行自己的脏值检测。每个监控函数都会检查变化。如果检测到任意变化,$scope对象就会触发指定的回调函数。

  4>.销毁

  当一个$scope在视图中不再需要时,这个作用域将会清理和销毁自己。

  示例代码:

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("HelloCtrl", ["$scope", function($scope){
                $scope.text = "Hello AngularJS!";
            }]);
        </script>
    </head>
    <body>
        <div ng-controller="HelloCtrl">
            {{ text }}
        </div>
    </body>
</html>

  ng-controller指令为这个DOM元素创建了一个新的$scope对象,并将它嵌套在$rootScope中。

  $scope与$rootScope具有相同属性或方法时,$scope将覆盖$rootScope中相同属性或方法。

<!DOCTYPE html>
<html ng-app="app">
    <head>
        <meta charset="utf-8" />
        <script src="../lib/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module("app", []);
            app.controller("HelloCtrl", ["$scope", "$rootScope", function($scope, $rootScope) {
                $rootScope.text = "Hello";
                // $scope.text = "Hello AngularJS!";
            }]);
        </script>
    </head>
    <body>
        <div ng-controller="HelloCtrl">
            {{ text }}
        </div>
    </body>
</html>
原文地址:https://www.cnblogs.com/libingql/p/6919770.html