Angular Scope解析与应用
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解析与应用的更多相关文章
- angular $scope对象
$scope是一个pojo对象 $scope提供了一些工具方法.例如:$watch() $apply(),一般不会手工去调用 $scope是表达式的执行环境也叫作用域 $scope是一个树形结构,与D ...
- Angular $scope和$rootScope事件机制之$emit、$broadcast和$on
Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...
- Angular $http解析通过接口获得的json数据
刚接触angular不久,对很多东西都不了解,今天需要用angular通过接口得到json数据,折腾了好久,总算是能获取到数据了,下面是部分源码,仅供参考: HTML部分: <body ng-a ...
- [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 ...
- Angular $scope和$rootScope
<!DOCTYPE html><html ng-app='myModule'><head lang="en"> <meta charset ...
- angular $scope.$watch
在$scope内置的所有函数中,用得最多的可能就是$watch 函数了.当你的数据模型中某一部分发生变化时,$watch函数可以向你发出通知. 你可以监控单个对象的属性,也可以监控需要经过计算的结果( ...
- 【原创】angularjs1.3.0源码解析之scope
Angular作用域 前言 之前我们探讨过Angular的执行流程,在一切准备工作就绪后(我是指所有directive和service都装载完毕),接下来其实就是编译dom(从指定的根节点开始遍历do ...
- Angular之 Scope和 Directive
---------------------------Scope-------------------------------- https://docs.angularjs.org/guide/sc ...
- angular源码分析:$compile服务——directive他妈
一.directive的注册 1.我们知道,我们可以通过类似下面的代码定义一个指令(directive). var myModule = angular.module(...); myModule.d ...
随机推荐
- 查看外网IP
同一个网络,登录不同网站/APP, 显示的登录IP可能不一样. 输入ip138.com 得到外网IP: 输入:http://www.net.cn/static/customercare/yourip. ...
- mybatis generator 覆盖xml文件
mybatis generator默认采用追加方式生成,所以我们如果要重新生成代码的时候那么要先删除原来的文件. 解决办法: 1:创建一个自定义补丁类. OverwriteXmlPlugin.java ...
- BZOJ 2502 Luogu P4843 清理雪道 最小流
题意: 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机 ...
- 处理半连接SQL自动改写内连接SQL一例
昨天刚写了半连接改写系列,今天就遇到了此类型SQL: 优化前 耗时:28s 返回:0 SELECT D.DAILYAUDITNO, D.TRANSTOACC FROM PB_DOIC.MM_DAILY ...
- 常见的awk内建变量
FS: 输入字段分隔符变量 语法: $ awk -F 'FS' 'commands' inputfilename 或者 $ awk 'BEGIN{FS="FS";}' OFS: 输 ...
- Win2008 Server搭建流媒体服务(在线看电影)
什么是流媒体服务呢. 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式, 与需要将整个视频文件全部下载之后才能观看的传统方式相比, 流媒体技术是通过将视频文件经过特殊的压缩方式分成一个 ...
- UE4 插件扩展引擎工具栏
UE4 作为游戏引擎,已经提供了非常强大的游戏开发的API.作为游戏制作者来讲,我们需要一些专用的功能辅助我们更好的开发游戏,而不是仅仅从构建游戏逻辑出发.因此也就有了扩展编辑器功能的这个想法,还好 ...
- 使用idea搭建ssh项目
参考: https://www.cnblogs.com/getchen/p/8036709.html 需要自己提前在数据库中建好表 然后连接数据库通过侧边栏的persistence来生成实体类和相应的 ...
- Python安装配置
Python下载 官网下载地址:https://www.python.org/downloads/windows/ 下载安装包: python-3.5.0-amd64(64位).exe python- ...
- HDU1074 Doing Homework 状态压缩dp
题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 /* 首先要明白的一点是状态1/0分别表示这件事做了还是没做 而1/0的位 ...