$rootScope
参考地址 https://docs.angularjs.org/api/ng/type/$rootScope.Scope
angular 的scope一般上都是有继承关系的,也就是说可以通过原型访问到父亲属性.
原型可以参考 http://www.cnblogs.com/keatkeat/p/3896758.html
$rootScope 提过了一些方法, 当然子scope也都继承了这些方法
$rootScope.new(isolate)
isolate 是 boolean ,中文翻译是隔离 。 也就是说创建一个$scope但是不要继承父亲
这个我们在写指令的时候通常会使用上。
$watch(watchExpression, listener, [objectEquality], [deregisterNotifier])
watch 就是属性监听。第一个参数是要监听的属性名字,参数2是回调事件
一般上我们都是监听$scope上的属性,但是如果你想监听一个普通的变量,可以这么写 $scope.$watch(function(){ retrun some var },listener)
var scope = $rootScope;
scope.name = 'misko';
scope.counter = 0;
expect(scope.counter).toEqual(0);
scope.$watch('name', function(newValue, oldValue) {
if(newValue === oldValue) { //do init }
scope.counter = scope.counter + 1;
});
expect(scope.counter).toEqual(0);
scope.name = 'alibaba' //在还没有digest前,修改关注的值是没有意义的!
scope.$digest();
// the listener is always called during the first $digest loop after it was registered
expect(scope.counter).toEqual(1);
注意红色的字,监听之后的第一个digest一定会触发一次监听回调,我们可以在回调中判断来做一下初始化,只有第一次会这样,接下来只有当数据changed才会触发回调。
在还没有digest的情况下不要去修改你关注的值,那是没有效果的 ,它就好比你把这个改变值的代码写在还没有watch之前,angular的watch要配合digest才管用,这个一般js的getter setter 手法不同。
var scope = $rootScope;
scope.name = 'misko';
scope.counter = 0;
scope.$watch('name', function(newValue, oldValue) {
//newValue = ""; 这里回事 alibaba,这不是我们要的!!!
});
scope.name = 'alibaba'
scope.$digest();
第3参数是 boolean , 是说要不要使用angular.equals来进行value is_change的对比方式, 没有用过,应该是和c#差不多,就是对比object的时候是比引用还是比值。
第4参数是 function , 每次$digest(),都会触发一次,不管值有没有改变。(这个是1.3才有的)
$watchGroup(watchExpressions, listener);
多个属性监听,但是回调相同的情况下可以使用 , 参数1是 Array<String | Function>
$watchCollection(obj, listener);
这个用来监听array或者object的改变,比如 array.push ,obj["x"] = x , 添加新的属性或值的情况。
$digest()
执行脏数据监测,dirty check , angular内有很多时候都是自动执行的,manual 执行可以写 $rootScope.$digest()
$destroy();
删除$scope和其子$scope , 所有监听都会清空.
$eval([expression], [locals]);
eval 和 js 的eval 类似,是angular自己写的javascript语法解析器,很有心啊,一堆正则一堆 if else.
参数2可以让我们传入scope, 来处理表达式,返回结果.
$apply([exp])
$apply(fn) , fn 跑完会自动触发 $rootScope.$digest();
一般上我们自己管理好 $digest()就行了
$on 和 $emit
$scope 就好比 elem , 可以把 on,emit 看做是游览器的事件机制。
当你在一个上层的scope绑定了一个事件, 在子层可以调用 $emit来触发,从而传入子层的scope给父层 .
app.controller("ctrl", ["$scope", "$rootScope", function ($scope, $rootScope) {
$scope.name = "1782";
$scope.$on("wawa", function (event, x) {
alert(event.targetScope.name);
alert(event.currentScope.name);
});
}]);
app.controller('ctrl2', ["$scope", "$rootScope", function ($scope, $rootScope) {
$scope.name = "5566";
$scope.$emit("wawa");
}]);
event 是个对象,里面有 targetScope,currentScope,name(事件名字),stopPropagation 方法(调用它阻止冒泡),preventDefault 方法(调用它注重默认事情,不是很理解),
defaultPrevented - {boolean}: true if preventDefault was called. 这个也了解.
event之后的参数就是$emit时候任意传入的
$broadcast(name, args);
上层scope向子层发布事件,反向理解就可以了。
随机推荐
- Smarty for foreach 使用
{for} {for}{forelse}用于创建一个简单的循环. 下面的几种方式都是支持的: {for $var=$start to $end}步长1的简单循环. {for $var=$start t ...
- 使用 PIVOT 和 UNPIVOT 行转列 列转行 报表统计 函数
官方文档:http://technet.microsoft.com/zh-cn/library/ms177410(v=SQL.105).aspx 可以使用 PIVOT 和 UNPIVOT 关系运算符将 ...
- 在JavaScript函数式编程里使用Map和Reduce方法
所有人都谈论道workflows支持ECMAScript6里出现的令人吃惊的新特性,因此我们很容易忘掉ECMAScript5带给我们一些很棒的工具方法来支持在JavaScript里进行函数编程,这些工 ...
- maven安装 maven上传jar包到库里面
maven的安装与配置:http://pansanday.blog.163.com/blog/static/381662802012727103454743/ maven上传jar包到库里面: 将私有 ...
- 最牛逼的的shell命令
参考 远程diff [root@jiangyi01.sqa.zmf /home/ahao.mah/ALIOS_QA/tools/iperf] #ssh ahao.mah@dnstest02.tbc c ...
- Android 之 SharedPreferences
1 简介 SharedPreferences是一种轻量级的数据存储方式,它可以用键值对的方式把简单数据类型(boolean.int.float.long和String)存储在应用程序的私有目录下(da ...
- HDU 蟠桃记
蟠桃记 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- 浅谈C++中的那些内存泄露
尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 老范也開始要讲C++设计模式了,必须快点看了.不然就要白花窝滴钱了. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间 ...
- Python 线程池的原理和实现及subprocess模块
最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自 ...
- Hadoop 开源调度系统zeus(二)
紧跟之前Hadoop 开源调度系统zeus(一) 本节主要介绍一下zeus的架构: 先给一个zeus的架构图 无论Master还是Worker都有一套WEB UI,无论从哪个上面去看,看到的结果都是一 ...