监控对象属性:$watch和$digest

$watch和$digest是相辅相成的。两者一起,构成了Angular作用域的核心:数据变化的响应。如果你学习过WPF,并基于WPF使用过一些MVVM框架,那你一定知道 INotifyPropertyChanged 这个接口,实现这个借口会让我们的对象在数据改变时通知UI,来呈现最新的数据。$watch和$digest其实也是同样的原理。

使用$watch,可以在Scope上添加一个监听器。当Scope上发生变更时,监听器会收到提示。给$watch指定如下两个函数,就可以创建一个监听器:

(1)、一个监控函数,用于指定所关注的那部分数据

(2)、一个监听函数,用于在数据变更的时候接受提示。

作为一名Angular用户,一般来说,是监控一个表达式,而不是使用监控函数。监控表达式是一个字符串,比如说“user.firstName”,通常 在数据绑定,指令的属性,或者JavaScript代码中指定,它被Angular解析和编译成一个监控函数。在这篇文章的后面部分我们会探讨这是如何做 的。在这篇文章中,我们将使用稍微低级的方法直接提供监控功能。

为了实现$watch,我们需要存储注册过的所有监听器。我们在Scope构造函数上添加一个数组:

function Scope() {
this.$$watchers = [];
}

在Angular框架中,双美元符前缀$$表示这个变量被当作私有的来考虑,不应当在外部代码中调用。

现在我们可以定义$watch方法了。它接受两个函数作参数,把它们存储在$$watchers数组中。我们需要在每个Scope实例上存储这些函数,所以要把它放在Scope的原型上:

Scope.prototype.$watch = function(watchFn, listenerFn) {
var watcher = {
watchFn: watchFn,
listenerFn: listenerFn
};
this.$$watchers.push(watcher);
};

另外一面就是$digest函数。它执行了所有在作用域上注册过的监听器。我们来实现一个它的简化版,遍历所有监听器,调用它们的监听函数:

Scope.prototype.$digest = function() {
_.forEach(this.$$watchers, function(watch) {
watch.listenerFn();
});
};

现在我们可以添加监听器,然后运行$digest了,这将会调用监听函数。

这些本身没什么大用,我们要的是能检测由监控函数指定的值是否确实变更了,然后调用监听函数。

最新文章

  1. 图解javascript
  2. SQL知识整理二:锁、游标、索引
  3. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码
  4. makefile示例
  5. 第三方Push服务:Urban Airship
  6. 【git】学习路径失败了
  7. ASP.NET Ajax In Action!
  8. python cmd模块练习
  9. .NET 4 并行(多核)编程系列之三 从Task的取消
  10. Robot Framework 使用1-环境配置及简单网站兼容性测试(转)
  11. require.js模块化写法
  12. [编织消息框架][网络IO模型]Netty Reactor
  13. sublime markdown 设置
  14. 复用$.ajax方式传递参数错误处理
  15. 反射生成SQL语句入门
  16. Go语言中多字节字符的处理
  17. 为什么Domain controller上的time synchronization非常重要?
  18. Hadoop1.2.1 配置文件详解
  19. 【RSS】我的RSS使用介绍
  20. jquery判断密码是否一致?

热门文章

  1. android: SQLite查询数据
  2. 修改oracle内存占用
  3. spring中使用mockito
  4. 【Android开发坑系列】之PopupWindow
  5. 进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】
  6. python数据结构之栈、队列的实现
  7. C#使用Dotfuscator混淆代码以及加密
  8. LR6 碱性电池才能带动微软鼠标
  9. TortoiseSVN and TortoiseGit 版本控制图标不见了
  10. This application is currently offline. To enable the application, remove the app_offline.htm file from the application r