参考地址 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向子层发布事件,反向理解就可以了。

随机推荐

  1. 【HDOJ】1341 Simple Computers

    注意PC要与31. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 40 ...

  2. Linux系统编程(29)——线程间同步(续篇)

    线程间的同步还有这样一种情况:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行.在pthread库中通过条件变 ...

  3. JAVA并发2

    Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接口有3个实现它的类 ...

  4. 转载-常用API接口签名验证参考

    原文地址: http://www.cnblogs.com/hnsongbiao/p/5478645.html 写的很好,就做个笔记了.感谢作者! 项目中常用的API接口签名验证方法: 1. 给app分 ...

  5. HDU_1238——最大子串搜索

    Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...

  6. Codeforces Round #292 (Div. 1) - B. Drazil and Tiles

    B. Drazil and Tiles   Drazil created a following problem about putting 1 × 2 tiles into an n × m gri ...

  7. 将 Web 应用性能提高十倍的10条建议

    提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其的期望值也处于历史上 ...

  8. 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构

    Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...

  9. 有关UITableViewCell的侧滑删除以及使用相关大神框架MGSwipeTableCell遇到的小问题

    提起笔,却不知道从何写起了,今天一整天都耗费在了这个可能根本不算是问题的小问题上,至今仍有一种蛋蛋的忧桑..(噢,不是提笔,是键盘手T_T) 表格视图在项目中就像是每日的家常便饭,在cell上添加侧滑 ...

  10. 【转】windows下vs2008/2010+opencv2.2开发环境搭建

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下载安装Cmake 2.用cmake配置opencv2.2,然后编译,安装 3. 在vs2008中配置opencv2.2 4.Demo 1.下 ...