• 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>
  • 相关阅读:
    for循环中的作用域 闭包
    for,forEach,for in ,for of,$.each和$().each应用
    交换变量的值
    URL和URI的关系
    Delphi Idhttp.Get方法
    Delphi 时间转换异常处理(各Win系统时间显示格式不同)
    Delphi 接口统一方法
    Delphi 高级停靠(Dock)技术的实现[转载]
    delphi 客户端_动态装载插件DLL
    ADOQuery导出Excel超快(大量数据)!
  • 原文地址:https://www.cnblogs.com/libingql/p/6919770.html
Copyright © 2020-2023  润新知