Knockoutjs官网翻译系列(四) computed中依赖追踪是如何工作的
初学者无需了解这些 ,但是很多高级程序员想知道我们为什么可以保持跟踪这些依赖以及可以正确的更新到UI中。它其实很简单。跟踪算法是这样的:
- 无论何时你定义了一个computed observable,KO 立即执行它的执行函数来获取初始值。
- 当执行函数正在运行,KO会在执行函数中所有使用到的observables之间(包括其它的computed observable)建立订阅关系。这个订阅回调必定使执行函数再次运行,循环整个过程回到第一步(释放所有的订阅关系并且不再使用)。
- KO想所有订阅者通知你的computed observable的新值消息。
所以,KO并不只是在第一次运行执行函数的时候发现依赖关系-它会在每一次执行的时候都再发现测依赖关系。这意味着这些依赖可以动态变化:依赖A可以决定computed observable是否也依赖于B或C。然后它只会在A或者B或C变化时被重新执行一次。 你不需要声明依赖,它们在代码运行时确定。
另一个巧妙的技巧是声明式绑定作为computed observables来简单实现。这样,如果一个绑定读取一个observable的值,那个绑定就依赖于了这个observable,当它发生变化的时候就会重新激活这个绑定。(原文是The other neat trick is that declarative bindings are simply implemented as computed observables. So, if a binding reads the value of an observable, that binding becomes dependent on that observable, which causes that binding to be re-evaluated if the observable changes.这个地方我感觉翻译的有毛病。)
使用peek控制依赖
KO的自动依赖跟踪通常能准确的知道你想要什么。但是你有时可能需要控制哪些observable将要更新你的computed observable,尤其是如果这个computed observable执行一个很简短的行为例如发送一个ajax请求。. peek方法让你可以无需创建依赖就能访问一个observable或者computed observable。
在下面的例子中,computed observable使用ajax来重新为一个叫做currentPageData的observable加载数据,它向服务器传递的数据params中有两个observable属性,也就是说无论何时pageIndex属性发生了变化这个computed observable 都将会更新,也就是会运行json的请求, 但是它忽略了selectedItem的变化,因为它使用peek来进行访问. 在这种情况下,当一系列新的数据加载的时候,用户可能希望为了追踪的目的只使用selectedItem的当前值 。
ko.computed(function() {
var params = {
page: this.pageIndex(),
selected: this.selectedItem.peek()
};
$.getJSON('/Some/Json/Service', params, this.currentPageData);
}, this);
注意: 为什么循环依赖没有意义
Computed observables 应该是将一些observable输入映射为一个单独的observable输出。这样的话在你的依赖链中形成循环是毫无意义的。 循环可能并不像递归;他们将类似于有两个电子表格单元,计算彼此的功能. 这将导致一个无限的循环。
那么如果你在你的依赖中出现了循环依赖那么ko会怎么处理呢? 它通过下面的规则来避免无限的循环::如果computed正在被执行 Knockout 将不会重新激活(执行)它。 这不会影响你的代码。在两种情况下是相关的: 当两个compute observables相互依赖,或者当一个computed observable 向另外一个拥有依赖的observable写入数据的收 (直接写或者通过一个依赖链中). 如果您需要使用这些模式之一,并希望完全避免循环依赖,您可以使用上面所述的peek功能。
总结说明,这一节算是翻完了,但是很多知识点理解上还是有问题。这一节的重点就是那个peek,它的主要作用就是:如果computed observable中使用了其它的observable,那么当那些observable有更新的时候会让这个computed observable再执行一次,如果这里面有ajax操作或其它耗时操作没有必要,那么我们使用peek可以单向解除这个依赖,当那些observable更新时使得我们computed observable无需跟着更新。
Knockoutjs官网翻译系列(四) computed中依赖追踪是如何工作的的更多相关文章
- Knockoutjs官网翻译系列(三) 使用Computed Observables
书接上回,前面谈到了在视图模型中可以定义普通的observable属性以及observableArray属性实现与UI元素的双向绑定,这一节我们继续探讨第三种可实现绑定的属性类型:computed o ...
- Knockoutjs官网翻译系列(一)
最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...
- Knockoutjs官网翻译系列(二) Observable 数组
承接前文,前文书说道了KO框架中如何使用observable的视图模型属性来与UI元素进行绑定并自动进行双向更新的事儿.observable属性除了服务基础数据类型之外,还定义了专门为服务数组类型的o ...
- 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx EF 6 Code-First ...
- 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)
原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...
- 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...
- 【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况
前言 本文翻译自“为电池寿命做优化”系列文档中的其中一篇,用于介绍如何使用Battery Historian分析电源使用情况. 中国版官网原文地址为:https://developer.android ...
- ECharts概念学习系列之ECharts官网教程之在 webpack 中使用 ECharts(图文详解)
不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E5%9C%A8%20webpack%20%E4%B8%AD%E4%BD%BF%E7%94% ...
- 【工利其器】必会工具之(三)systrace篇(1)官网翻译
前言 Android 开发者官网中对systrace(Android System Trace)有专门的介绍,本篇文章作为systrace系列的开头,笔者先不做任何介绍,仅仅翻译一下官网的介绍.在后续 ...
随机推荐
- Swift中使用构建配置来支持条件编译-b
在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 2 3 4 5 6 7 8 9 #if TARGET_OS_IPHON ...
- C++11原子操作性能测试
测试结论是发现C++11原子操作在性能上,比以往用到的InterlockedIncrement或__sync_add_and_fetch性能上慢了1倍左右. 另外补充一点,在对原子变量进行比较的时候, ...
- What qualities characterize a great PhD student
省理工计算机教授David Karger接触了许多世界上最杰出的博士生,近日总结出了优秀博士通常具备的五点品质:0 过人的智力 1 好奇心 2 创造力 3 纪律性与生产力 4 与观众沟通 5 与伙伴沟 ...
- 324篇CSS应用效果集合(梦想天空,可同时应用于Web开发与Qt界面开发)
http://www.cnblogs.com/lhb25/category/146075.html http://www.yyyweb.com/
- 【HDOJ】2809 God of War
状态DP. /* 2809 */ #include <iostream> #include <queue> #include <cstdio> #include & ...
- 【转】(DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device
原文网址:http://www.cnblogs.com/biglucky/p/4057495.html Linux kernel 是怎么将 devicetree中的内容生成plateform_devi ...
- jquery 选择器 的学习,自己慢慢来
1//加载所有元素后,执行下列代码 <script type="text/javascript"> $(document).ready(function(){ //选择 ...
- HDOJ 2131 Probability
Problem Description Mickey is interested in probability recently. One day , he played a game which i ...
- @Query注解的用法(Spring Data JPA)
参考文章:http://www.tuicool.com/articles/jQJBNv 1. 一个使用@Query注解的简单例子 @Query(value = "select name,au ...
- SKPhysicsJointSliding类
继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架 /System/Library/Frameworks/SpriteKit. ...