美文网首页
AngularJs中控制器的定义,实例化,作用域范围

AngularJs中控制器的定义,实例化,作用域范围

作者: TryCatch菌 | 来源:发表于2019-05-07 17:20 被阅读0次

    AngularJs中控制器的定义,实例化,作用域范围

    基于AngularJS入门与进阶(江荣波 著)这本书的笔记

    AngularJS 1.x的demo

    AngularJS1.x和Angular2,4,5是不一样的两个东西,构建方式,语法,都很多不同


    AngularJs控制器定义与实例化

    写一个简单的计算demo,通过解读代码来理解控制器的实例化

    <!DOCTYPE html>
    <html lang="en" ng-app="testApp">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script  src="/lib/angular/angular.js"></script>
        <script type="text/javascript">
    
            /*$scope是作用域对象*/
            function testController($scope) {
                $scope.price = 0;
                $scope.num = 0;
    
                this.totalPrice = function(){
                    return $scope.price*$scope.num
                }
            }
    
            /*angular对象的module()方法返回一个模块实例*/
            var testApp = angular.module("testApp",[]);
            /*angular对象的module()方法返回一个模块实例*/
            testApp.controller("testController",testController);
    
        </script>
    </head>
    <body>
    <div ng-controller="testController as tcr">
        <!-- ng-model 双向绑定 -->
        <div>单价:<input type="number" ng-model="price"/></div>
        <div>数量:<input type="number" ng-model="num"/></div>
        <div>总价:{{tcr.totalPrice()}}</div>
    </div>
    
    </body>
    </html>
    

    AngularJS框架在window对象中增加了一个全局的angular对象,调用angular对象的module()方法返回一个模块实例,调用模块实例的controller()方法来声明一个控制器。

    ng-controller指令

    AngularJS框架遇到ng-controller指令时会根据ng-controller指令指定的控制器名称查找控制器构造方法,然后使用对应的构造方法实例化控制器对象,并将控制器依赖的对象注入控制器对象中

    上面的代码片段就是一个完整的实例化控制器的过程:

    1. 当AngularJS框架遇到ng-controller指令时会查找名为testController的构造方法实例化构造器对象
    2. 控制器对象实例化时创建一个新的作用域对象,名称为scope,然后会把scope对象注入控制器对象中
    3. ng-model指令在作用域对象scope和input表单之间建立数据绑定,控制器通过scope对象访问表单数据了,双向数据绑定,数据根据输入及时变化
    控制器作用域范围

    ng-controller指令实例化控制器时会产生一个新的作用域对象,一个页面中可能会有多个ng_controller,每个控制器对应的作用域对象只能与ng-controller指令所在标签的开始标签与结束标签之间的DOM元素建立数据绑定。

    <!DOCTYPE html>
    <html lang="en" ng-app="testApp">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script  src="/lib/angular/angular.js"></script>
        <script type="text/javascript">
    
            /*$scope是作用域对象*/
            function testController1($scope) {
                $scope.price = 0;
                $scope.num = 0;
                this.totalPrice = function(){
                    return $scope.price*$scope.num
                }
            }
            /*$scope是作用域对象*/
            function testController2($scope) {
                $scope.price = 10;
                $scope.num = 1;
                this.totalPrice = function(){
                    return $scope.price*$scope.num
                }
            }
            /*angular对象的module()方法返回一个模块实例*/
            var testApp = angular.module("testApp",[]);
            /*angular对象的module()方法返回一个模块实例*/
            testApp.controller("testController1",testController1);
            testApp.controller("testController2",testController2);
    
        </script>
    </head>
    <body>
    <div ng-controller="testController1 as tcr">
        <!-- ng-model 双向绑定 -->
        <div>单价:<input type="number" ng-model="price"/></div>
        <div>数量:<input type="number" ng-model="num"/></div>
        <div>总价:{{tcr.totalPrice()}}</div>
    </div>
    <div ng-controller="testController2 as tcr">
        <!-- ng-model 双向绑定 -->
        <div>单价:<input type="number" ng-model="price"/></div>
        <div>数量:<input type="number" ng-model="num"/></div>
        <div>总价:{{tcr.totalPrice()}}</div>
    </div>
    
    </body>
    </html>
    

    运行可以发现,两个作用域中变量名相同,但是结果互不干扰

    20190507162756.png
    控制器中处理DOM事件

    AngularJS框架为我们提供了一系列的事件绑定指令,这些指令是在原生的JavaScript事件名称前增加“ng-”前缀,例如ng-click、ng-keyup等,具体可以查看API手册。

    <!DOCTYPE html>
    <html ng-app="testApp">
    <head>
        <meta charset="UTF-8">
        <title>Hello Word</title>
        <script  src="/lib/angular/angular.js"></script>
        <script type="text/javascript">
            function msgController() {
                this.showMsg = function () {
                    alert("click");
                }
            }
            /*angular对象的module()方法返回一个模块实例*/
            var testApp = angular.module("testApp",[]);
            /*angular对象的module()方法返回一个模块实例*/
            testApp.controller("msgController",msgController);
    
        </script>
    </head>
    <body ng-controller="msgController as msgC">
    <input type="button" ng-click="msgC.showMsg()" value="click">
    </body>
    </html>
    
    20190507164507.png

    相关文章

      网友评论

          本文标题:AngularJs中控制器的定义,实例化,作用域范围

          本文链接:https://www.haomeiwen.com/subject/lwsyoqtx.html