首先引入 angular 的根作用域:$rootScope

ng-app:定义了angualr的作用域

ng-controller:定义了控制器

$scope定义了视图与控制器之间的纽带,而scope本身是垂直继承的,当子作用域没有定义,便会找父作用域,逐层往上找直到根作用域 $rootScope.

没有定义控制器的元素对应的即是根作用域,如下(<div>{{msg}}</div>)

看下面代码,当我们点击parent控制器时,发现其子控制器内容会跟着变化,而父控制器以及根作用域绑定的元素内容没有变化(msg默认在各作用域都没有定义,因此继承根作用域的msg="Hello KiTy"):

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>test</title>
</head>
<body ng-app = "myApp">
<div>{{msg}}</div>
<div ng-controller="parent" ng-click="change()">{{msg}}
<div ng-controller="child">{{msg}}</div>
<div ng-controller="child1" ng-click="change1()">{{msg}}</div>
<div ng-controller="child2">{{msg}}</div>
</div>
<script src="angular.js"></script>
<script> var app = angular.module('myApp', []);
app.run(function($rootScope){          //run方法根作用域$rootScope的方法,因其没有控制器,不能用controller方法
var msg = "Hello KiTy"
$rootScope.msg = msg;
})
app.controller("parent", function($scope){
$scope.change = function(){
$scope.msg = "lol";
}
})
app.controller("child", function($scope){ })
app.controller("child1", function($scope){ })
app.controller("child2", function($scope){ })
</script>
</body>
</html>

由上不难发现scope是垂直继承,且是单向由上当下的,即父作用域不会继承子作用域数据绑定的值

若想通过子作用域传递其数据到父作用域可以在子控制器函数中加以下代码:

方法一:

 app.controller("parent", function($scope,$rootScope){
console.log($scope)
$scope.change = function(){
$rootScope.msg = "lol";
}
})

方法二:

 app.controller("parent", function($scope){
console.log($scope)
$scope.change = function(){
$scope.$parent.msg = "lol";
}
})

那么找个$parent怎么来的?答案:console.log($scope);控制台输出$scope后找到的,意为其父作用域

当然了我们还发现了兄弟作用域$$prevSibling、$$nextSibling,可以通过这两项来改变兄弟作用域内数据,意为前一个兄弟、后一个兄弟

代码:

 app.controller("child1", function($scope){
console.log($scope);
$scope.change1 = function(){
$scope.$$prevSibling.msg = "lol";
         $scope.$$nextSibling.msg = "lol";
}
})

通过以上分析我们发现作用域层级关系就像DOM树型机构,一 一对应,有根作用域 $rootScope,子作用域 $scope ,每一个子作用域有其兄弟作用域

可通过 $parent; $$prevsibling; $$nextSibling 向其父作用域以及兄弟作用域传递数据。(若子作用域默认有数据绑定,则不会受其他作用域影响)

Angular作用域的层级概念(scope)的更多相关文章

  1. angular源码分析:angular中$rootscope的实现——scope的一生

    在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...

  2. angular controller as syntax vs scope

    今天要和大家分享的是angular从1.2版本开始带来了新语法Controller as.再次之前我们对于angular在view上的绑定都必须使用直接的scope对象,对于controller来说我 ...

  3. 从零开始讲解JavaScript中作用域链的概念及用途

    从零开始讲解JavaScript中作用域链的概念及用途 引言 正文 一.执行环境 二.作用域链 三.块级作用域 四.其他情况 五.总结 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号搜 ...

  4. Angular——作用域

    基本介绍 应用App是无法嵌套的,但是controller是可以嵌套的,每个controller都会对应一个模型(model)也就是$scope对象,不同层级的controller下的$scope遍产 ...

  5. angular作用域分析

    angualr作用域 Scope 控制器作用域的继承特性Ⅰ 绑定的数据是变量 单向隔离(兄弟之间互不影响,父子之间单向继承) 父级控制器的数据绑定会影响到子级控制器 前提是子控制器内没有绑定数据 单向 ...

  6. Python基础-作用域和命名空间(Scope and Namespace)

    在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用.赋值操作就是名字和对象的绑定或重绑定.这和C++中的引用是一样的. 1,基础概念 ...

  7. angular学习(三)-- $scope

    1.3 视图数据模型:$scope $scope 是用来视图和数据之间的胶水.粘合剂 视图和控制器之间的数据桥梁 用于在视图和控制器之间传递数据 用来暴露数据模型(数据.行为) 监视模型数据的变化,做 ...

  8. angular.js学习笔记--概念总结

    好久没更新了,现在开始学习学习angularjs,并且把学习到的一些知识总结记录一下,方便以后查找以及希望能给初学者一些帮助!(由于本人也是初学ng所以各位慎重理解!) 废话不多说,开始! $root ...

  9. 2 Angular 2 的核心概念

    一.组件(Components): 组件是构成 Angular 应用的基础和核心,它是一个模板的控制类,用于处理应用和逻辑页面的视图部分.组件知道如何渲染自己及配置依赖注入,并通过一些由属性和方法组成 ...

随机推荐

  1. 基于Ruby的Watir-WebDriver自动化测试方案

    Watir-WebDriver       —— 软件测试的自动化时代 QQ群:160409929 自动化测试方案书 系统架构 该自动化测试框架分三个模块:Test用例.Control控制层.Tool ...

  2. 归档—监控ORACLE数据库告警日志

    ORACLE的告警日志里面包含许多有用的信息,尤其是一些ORACLE的ORA错误信息,所以有必要及时归档.监控数据库告警日志的ORA错误,及时提醒数据库管理员DBA处理这些错误信息,那么我们首先来看看 ...

  3. Vmware虚拟机进入BIOS方法

    在VMware里面如何进入BIOS是个头疼的问题,因为启动界面一闪而过(下面两个图如果不设置bios.bootDelay,基本上很难抓到),即使你狂按F2或ESC键(ESC: 调整启动顺序;F2: 进 ...

  4. SQL Server删除distribution数据库

    在数据库服务器删除复制(发布订阅)后,如何删除掉数据库distribution呢?如果你通过SSMS工具去删除数据库distribution,你会发现根本没有删除选项. 下面介绍一下删除distrib ...

  5. SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例

    我们都知道CHAR(integer_expression)将ASCII代码转换为字符.当integer_expression介于 0 和 255 之间的整数.如果该整数表达式不在此范围内,将返回 NU ...

  6. VS2015 Git使用教程——优化项目编辑日志

    一.前言 公司项目中,修改日志管理是一件很繁琐的事情,而且项目维护时间长了,会遗留下各种有用或无用的日志,对于有代码洁癖的人来说,无疑是一种灾难. 1.公司日志记录结构: 2.Git日志记录结构: 二 ...

  7. MongoDB学习笔记~Mongo集群和副本集

    回到目录 一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器 ...

  8. C# Lambda表达式

    C# Lambda表达式 Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式 ...

  9. mysql5.7.1 zip版本安装记录

    很久没遇到使用mysql的项目了,今天下载了个,发现变了很多,搜索了下,发现按http://www.cnblogs.com/wenthink/p/MySQLInstall.html中提到的基本可以使用 ...

  10. FeWeb基础之JavaScript简介

    FeWeb基础之JavaScript简介 1.JavaScript的基本介绍 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,它是通过嵌入或调入在标准的HTML语言中实现的.Ja ...