美文网首页angular
AngularJs作用域理解

AngularJs作用域理解

作者: TryCatch菌 | 来源:发表于2019-06-23 23:38 被阅读0次

    AngularJs作用域理解

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

    AngularJS 1.x的demo

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


    AngularJS程序中作用域的主要功能是存放模型数据,当HTML页面中出现ng-app和ng-controller指令时,AngularJS框架会自动创建作用域对象,我们只需将其注入即可。

    每个AngularJS应用至少会有一个名称为$rootScope的作用域,它是AngularJS应用的根作用域。框架中的ng-app指令,它可以出现在任何HTML标签中,用于启动AngularJS框架。当AngularJS启动时会自动创建一个根作用域对象rootScope,当使用ng-controller指令实例化控制器对象时,AngularJS框架会创建一个子作用域scope,默认情况下,该子作用域会继承rootScope作用域的所有属。 如下代码就是ng-init指令在rootScope作用域对象中新增了userName属性,然后在scopeController控制器的子作用域中取到成功输出name:jock

    <!DOCTYPE html>
    <html lang="en" ng-app="scopeApp">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script  src="/lib/angular/angular.js"></script>
        <script type="text/javascript">
            var scopeApp = angular.module("scopeApp",[]);
            scopeApp.controller("scopeController",function ($scope,$log) {
                $log.log("name:" + $scope.userName)
            });
        </script>
    </head>
    <body ng-init="userName='jock'">
        <div ng-controller="scopeController"></div>
    </body>
    </html>
    

    AngularJs作用域继承

    JavaScript对像继承机制

    JavaScript对像继承机制有三种

    1. 构造方法原型链继承
    2. 使用appley、call方法实现继承
    3. 对像实例间继承

    AngularJs是基于方法原型链继承实现的,这里记录下概念,书中原话:每个JavaScript构造方法都有一个名称为prototype的属性,可以指向另一个对象。当我们访问对象属性时(例如obj.name),JavaScript引擎会从对象的所有属性中查找该属性,如果找到就返回属性值,如果没有找到就继续从prototype属性指向的对象属性中查找,如果仍然没有找到,则会沿着prototype链一直查找下去,直到prototype链结束或找到对象为止。

        <script type="text/javascript">
            function People() {
                this.eat = function () {
                    console.log("pelple eat------------")
                }
            }
            
            function Man(age) {
                this.age = age;
            }
            // Man 的prototype属性指向People
            Man.prototype = new People();
            var man =  new Man("20");
            console.log(man.age);
            // 本身如果没有,会找指向的prototype 对像
            man.eat();
        </script>
    

    控制台输出

    20
    pelple eat------------
    
    AngularJs作用域对像原型继承

    AngularJs继承采用构造方法原型继承,在AngularJs作用域构造方法中提供了一个$new()成员方法,用于创造子作用域,源码这里就不重复了,书里面很详细,只记录下过程

        var parent = $rootScope;
        var child = parent.$new();
    

    示例代码

    
    <!DOCTYPE html>
    <html lang="en" ng-app="scopeApp">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script  src="/lib/angular/angular.js"></script>
        <script type="text/javascript">
            var scopeApp = angular.module("scopeApp",[]);
            scopeApp.controller("fatherScope",function ($scope,$log) {
                $scope.age = "18";
            });
            scopeApp.controller("childScope",function ($scope,$log) {
                $scope.sex = "男";
                console.log("name:" + $scope.userName + " "+ "age:" + $scope.age + " " + "sex:" + $scope.sex );
            });
    
        </script>
    </head>
    <body ng-init="userName='jock'">
        <div ng-controller="fatherScope">
            <div ng-controller="childScope"></div>
        </div>
    </body>
    </html>
    

    控制台成功输出

    name:jock age:18 sex:男
    

    AngularJS框架查找到ng-app指令时启动应用,创建$rootScope作用域。然后AngularJS框架查找到第一个ng-controller指令,指向名称为fatherScope的控制器,并调用$rootScope.$new()方法,以原型继承的方式创建$rootScope作用域的子作用域对象(记为$scope1)。当fatherScope构造方法接收一个名称为$scope的参数时,AngularJS实例化控制器对象时会把$scope1对象注入控制器对象中。接下来AngularJS继续遍历DOM元素,遇到第二个嵌套的ng-controller指令时调用$scope1.new()方法,以$scope1为原型创建子作用域(记为$scope2,$scope2作用域对象能够访问$scope1作用域对象的所有属性)。

    相关文章

      网友评论

        本文标题:AngularJs作用域理解

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