Scope层级结构

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

顶层服务对象$rootScope来源于ng模块。由$RootScopeProvider提供。

由于ng模块是angular.bootstrap()运行时依赖的模块,所以在整个应用中都能够通过$rootScope引用,并且在这个应用中是唯一的。但唯一性仅限于单个应用内,由于服务都存在注入器中,而每一个bootstrap应用有自己的注入器,所以,$rootScope作为一个服务。在不同的应用中是不同的,彼此互不影响。

除了顶层的$rootScope,子Scope分为普通子Scope和孤立子Scope:普通Scope继承自父Scope,因此能够在普通子Scope中直接訪问父Scope的属性;孤立Scope和父Scope没有继承关系,所以不能直接訪问父Scope的属性,但通过$parent属性能够訪问父Scope对象。

不论普通子Scope还是孤立子Scope,都能够通过$scope.$root訪问$rootScope。

创建子Scope

$childScope = $parentScope.$new(isolate,parent)

參数isolate为布尔值。假设为true,表示创建的子Scope是孤立的。

參数parent没有赋值。默认是$parentScope。

监測单个表达式

$scope.$watch(watchExp, listener,objectEquality)

參数watchExp是被监控的表达式。

參数listener是监听方法。參数objectEquality是布尔值,假设为true。表示比較方式为对象的比較,而不是基本类型相互比較。假设是对象比較,仅仅要两个对象的属性一致,则相同也觉得是相等的。

每运行一次$watch()方法创建一个watcher对象,这个watcher对象包括下面属性:

  • fn: 即參数listener。
  • get: $parse(watchExp)得到的方法。

  • exp: 即參数watchExp。
  • eq:即參数objectEquality。
  • last: 參数watchExp上一次的运行结果。

当中监听方法listener的接受的參数分别为:

  • value:这次运行的结果。
  • last:上次运行的结果。
  • current:当前scope对象。

表达式解析之后,方法get()的參数:

  • current:scope对象。

监測一组表达式

$scope.$watchGroup(watchExps, listener)

监測一组表达式,仅仅要当中一个表达式发生变化,就运行Listener。

监听方法listener的接受的參数分别为:

  • newValues:这次运行的结果。

  • oldValues:上次运行的结果。

  • current:当前scope对象。

监測集合对象

$scope.$watchCollection(collection,listener)

监測数组等集合对象是否发生了变化。

原理:在JavaScript中。数组和对象一样是有属性的。数组的索引就是数组的元素。所以$watchCollection事实上就是遍历集合的索引属性,通过监測每一个属性值的变化来推断集合是否发生了变化。当然,集合长度发生变化也在监測范围。

绑定事件监听

var destroyFn = $scope.$on(name, listener);
destroyFn(); // remove this listener

监听指定事件。并返回摧毁该事件监听的destroy方法。

事件监听接受的第一个參数是event对象,event对象的属性例如以下:

  • name:事件名。

  • targetScope:目标scope。
  • currentScope:当前scope。

  • stopPropagation:方法,中断运行。

  • preventDefault:方法,取消默认行为。
  • defaultPrevented:假设preventDefault()被运行过,则为true。

事件监听listener中的this指向null。

向下派发事件

把Scope的层级结构比作一个从上而下的树。向下派发就是从根节点到子节点的过程。

在当前Scope派发事件,并派发给全部的子Scope(包括后代Scope)。这个与浏览器的事件派发全然不同。更重要的是,事件是按树的深度优先顺序派发的:根节点à左节点à…à左叶子节点à右叶子节点à…à右节点。

$scope.$broadcast(name, args);

向上派发事件

从当前Scope開始。向父Scope派发事件。

$scope.$emit(name, args);

原理:通过$scope的$parent訪问父Scope。从而实现向父scope派发事件。这个过程和浏览器事件的冒泡过程类似。

运行表达式

在当前Scope范围内运行表达式。

$scope.$eval(expr, locals);
$scope.$apply(expr);
// == $parse(expr)(this, locals)

方法$eval()和$apply()的差别:$apply()会捕获expr运行中的异常,而$eval()不会。

所以$eval()适合Angular内部代码调式使用。

而$apply()通常是在浏览器事件监听。setTimeout等方法中被使用。

Angular Scope解析与应用的更多相关文章

  1. angular $scope对象

    $scope是一个pojo对象 $scope提供了一些工具方法.例如:$watch() $apply(),一般不会手工去调用 $scope是表达式的执行环境也叫作用域 $scope是一个树形结构,与D ...

  2. Angular $scope和$rootScope事件机制之$emit、$broadcast和$on

    Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...

  3. Angular $http解析通过接口获得的json数据

    刚接触angular不久,对很多东西都不了解,今天需要用angular通过接口得到json数据,折腾了好久,总算是能获取到数据了,下面是部分源码,仅供参考: HTML部分: <body ng-a ...

  4. [AngularJS] Using the Angular scope $destroy event and method

    With Angular scopes, you have access to a $destroy event that can be used to watch $scope events. Th ...

  5. Angular $scope和$rootScope

    <!DOCTYPE html><html ng-app='myModule'><head lang="en"> <meta charset ...

  6. angular $scope.$watch

    在$scope内置的所有函数中,用得最多的可能就是$watch 函数了.当你的数据模型中某一部分发生变化时,$watch函数可以向你发出通知. 你可以监控单个对象的属性,也可以监控需要经过计算的结果( ...

  7. 【原创】angularjs1.3.0源码解析之scope

    Angular作用域 前言 之前我们探讨过Angular的执行流程,在一切准备工作就绪后(我是指所有directive和service都装载完毕),接下来其实就是编译dom(从指定的根节点开始遍历do ...

  8. Angular之 Scope和 Directive

    ---------------------------Scope-------------------------------- https://docs.angularjs.org/guide/sc ...

  9. angular源码分析:$compile服务——directive他妈

    一.directive的注册 1.我们知道,我们可以通过类似下面的代码定义一个指令(directive). var myModule = angular.module(...); myModule.d ...

随机推荐

  1. D2. Toy Train

    D2. Toy Train time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. Laravel Excel模板导出-带图片

    Laravel Excel版本 3.1 1.数据准备 建个2个表,加点数据,控制器中查数据,给模板使用. 表1-order:id, order_no, img_path, note 表2-order_ ...

  3. 雷林鹏分享:PHP 错误处理

    在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重要的部分.如果您的 ...

  4. li标签和checkbox绑定

    参考原文:https://www.cnblogs.com/youxin/p/3885496.html 我们经常需要li或span包含一个checkbox,不管点击checkbox或li都会触发相应的事 ...

  5. java关于时间的相关操作

    /** * 获取当天时间零点 * @return */ public Date gettoday(){ SimpleDateFormat sdf = new SimpleDateFormat(&quo ...

  6. 初次使用IDEA创建maven项目

    第一次使用IDEA,创建一个maven项目,首先下载maven,官方地址:http://maven.apache.org/download.cgi 解压,在环境变量里配置 path里 D:\maven ...

  7. SQL中带有NOT IN 子查询改写

    报表程序中的一段SQL运行很慢,代码如下: 优化前: 耗时:1337s INSERT INTO PER_LTE_ZIB_PB_COMMISSION_07 SELECT P.TOPACTUALID, Q ...

  8. 数组排序函数-php数组函数(一)

    数组排序,共13个 函数中有u的,能自定义比较函数:有k的,按照键来排序:有r(reverse)的,倒序:有a(association)的,一定是键值关联,除了rsort() usort() sort ...

  9. chrome最强大的浏览器插件推荐,只要你会用其他的插件你可以删除了

    我们在学习和工作中经常会需要用到各种各样不同需求的插件,结果chrome插件越装越多,chrome浏览器也越来越慢!有时候链我们自己都懵圈了,一时间都想不起来这个插件是干什么用的.更可气的是,很多时候 ...

  10. day21 05 员工信息表

    day21 05 员工信息表 假设有一个员工信息表,里面有每个员工的名字,id,年龄,电话,还有他们所作的工作,而有时候我们并不需要所有的信息,而想根据某些条件,寻找符合条件即可,即筛选, 比如想要筛 ...