我们知道在使用ng-app或者ng-controller指令的时候,都会创建一个新的作用域($rootScope或者是$scope),并且在使用ng-controller指令创建的作用域会继承父级作用域($rootScope或者是$scope)所有的方法和属性。

但是这里继承的属性就有一些学问了

运行如下代码:

html

<div ng-controller="SomeController">
  {{ someBareValue }}
  <button ng-click="someAction()">Parent button</button>
  <div ng-controller="ChildController">
    {{ someBareValue }}
    <button ng-click="childAction()">Child button</button>
  </div>
</div>

js

angular.module('myApp', [])
  .controller('SomeController', function($scope) {
    $scope.someBareValue = 'hello computer';
    $scope.someAction = function() {
      $scope.someBareValue = 'hello human, from parent';
    };
  })
  .controller('ChildController', function($scope) {
    $scope.childAction = function() {
      $scope.someBareValue = 'hello human, from child';
    };
  });

初始加载完,父子作用域显示同样的值

当点击Parent button的时候,可以看到父子作用域同时变化

然后点击Child button的时候,子作用域的值更新了

而后再次点击Parent button的时候,发现父作用域更新了,但是子作用域却不在变化。

这是因为,父子作用域间的继承是通过的是一个 字符串 数字或者布尔值来实现的,这就是JS的值复制

再运行如下代码:

html

<div ng-controller="SomeController">
  {{ someModel.someValue }}
  <button ng-click="someAction()">Parent button</button>
  <div ng-controller="ChildController">
    {{ someModel.someValue }}
    <button ng-click="childAction()">Child Button</button>
  </div>
</div>

js

angular.module('myApp', [])
  .controller('SomeController', function($scope) {
    $scope.someModel = {
      someValue: 'hello computer'
    }
    $scope.someAction = function() {
      $scope.someModel.someValue = 'hello human, from parent';
    };
  })
  .controller('ChildController', function($scope) {
    $scope.childAction = function() {
      $scope.someModel.someValue = 'hello human, from child';
    };
  });

可以看到这个例子和上面例子的区别主要在于,子作用域继承自父作用域是通过一个对象someModel实现的,运行该例子。

初始完成之后,父子作用域显示相同字符串。

然后无论点击Parent Button 还是Child Button,父子作用域都同步显示相同的字符串。

这是因为,父子作用域间的继承是通过的是一个 对象 来实现的,这就是JS的引用复制

此外,除了ng-controller之外

ng-include

ng-switch

ng-repeat

ng-view

ng-if

都是有同样的特性。

Angular JS 中 ng-controller 值复制和引用复制的更多相关文章

  1. 秒味课堂Angular js笔记------Angular js中的工具方法

    Angular js中的工具方法 angular.isArray angular.isDate angular.isDefined angular.isUndefined angular.isFunc ...

  2. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  3. angular.js 中的作用域 数据模型 控制器

    1.angular.js 作为后起之秀的前端mvc框架,他于传统的前端框架都不同,我们再也不需要在html中嵌入脚本来操作对象了.它抽象出了数据模型,控制器及视图. 成功解耦了应用逻辑,数据模型,视图 ...

  4. angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制

    Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $ap ...

  5. Angular.js中处理页面闪烁的方法详解

    Angular.js中处理页面闪烁的方法详解 前言 大家在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况.数据还没响应,但页面已经渲染了.这是因为浏览器和angularjs渲染 ...

  6. js中以键值对的形式当枚举

    js中以键值对的形式当枚举var Penum= { B: "姓名", C: "所属居委", D: "证件号", E: "性别&qu ...

  7. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  8. Angular JS 中的服务注册方法

    在Angular JS中创建服务的几种方法 factory() service() constant() value() provider() factory(name,fn(){}) 该服务为单例的 ...

  9. 图文结合深入理解 JS 中的 this 值

    图文结合深入理解 JS 中的 this 值 在 JS 中最常见的莫过于函数了,在函数(方法)中 this 的出现频率特别高,那么 this 到底是什么呢,今天就和大家一起学习总结一下 JS 中的 th ...

  10. angularjs某些指令在外部作用域继承并创建新的子作用域引申出的“值复制”与“引用复制”的问题

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

随机推荐

  1. Markdown教程 <1>

    Markdown教程 <1> 本文在本地使用atom编辑后,直接将代码赋值到博客园中的markdown编辑器中生成 1. markdown字体,段落控制 以下引用块里面为源码,引用块下方为 ...

  2. 【java】MD5加密工具

    MD5: /** * 对指定字段进行MD5加密 * 参数为空或发生异常都会返回 @PASE-_FAIL (-1) * @author ZX * @date 2018年09月10日16:03:07 * ...

  3. yii中常用路径

    //YII framework路径Yii::getFrameworkPath(); //protected/runtimeYii::app()->getRuntimePath(); //在vie ...

  4. Web安全深度剖析

    Web安全深度剖析 链接:https://pan.baidu.com/s/15NulgWNzQ2JPCdn9q1jE-g 提取码:6y83    Web安全深度剖析>总结了当前流行的高危漏洞的形 ...

  5. 数据库root密码删除

    1 打开mysql.exe和mysqld.exe所在的文件夹,复制路径地址   2 打开cmd命令提示符,进入上一步mysql.exe所在的文件夹.   3 输入命令  mysqld --skip-g ...

  6. 提升——树形DP

    这里讲提高一点的内容,所以没有树形DP基础的,先看一下基础部分: 浅说——树形DP 闲言不表,看第一题. 这道题是典型的树上最长链问题.(就是一个模板题) 给定一棵树,树上共有N个节点(N<=5 ...

  7. HDU 5791:Two(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description   Alice gets two sequences A ...

  8. Tensorflow教程(2)Tensorflow的常用函数介绍

    1.tf.constant tf.constant用来定义一个常量,所谓常量,广义上讲就是“不变化的量”.我们先看下官方api是如何对constant函数来定义的: tf.constant( valu ...

  9. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  10. 阿里云体验:安装jdk

    在阿里云的linux服务器上默认是没有安装java环境的,需要自己安装.查了许多资料,发现这篇文章简洁易用.http://www.cnblogs.com/cloudwind/archive/2012/ ...