KnockoutJS中computed
和pureComputed
之间的区别是什么?
我可以安全地使用pureComputed
代替computed
吗?
答案 0 :(得分:25)
他们非常相似。 pureComputed
computed
有一些性能优化,并试图通过了解谁在跟踪其更改来防止内存泄漏。
在很多情况下,您可以安全地将pureComputed
替换为observable
。计算出的The difference is内的函数:
1.评估计算的观察值不应引起任何副作用。
2.计算的可观察量的值不应根据评估的数量或其他“隐藏”信息而变化。它的值应该仅基于应用程序中其他可观察对象的值,对于纯函数定义,它们被视为其参数。
因此,根据经验,任何只是明确转换某些常规pureComputed
属性的计算可观察量应该可以正常computed
,否则请坚持使用pureComputed
。
should follow this何时/为什么你不使用{{1}}观察者。这是一个相关的摘录:
您不应将纯特征用于计算的observable,以便在其依赖项发生更改时执行操作。
如果评估者有重要的副作用,你不应该使用纯计算机的原因只是计算器没有活动订阅者时评估者不会运行(因此正在休眠)。如果评估者在依赖关系发生变化时始终运行很重要,那么请使用常规计算器。
答案 1 :(得分:18)
我同意@Jeroen,我想在J. Munro的book中添加一个简短的例子,它帮助了我很多,所以这对其他人也有帮助。
首先,pureComputed observable与计算的observable非常相似,具有多项性能和内存改进。该名称来自Pure function编程术语,这意味着任何仅使用局部变量的函数都可能是纯粹的,而使用非局部变量的任何函数都可能是不纯的。
Knockout.js中的可观察对象的处理方式不同。因此,pureComputed observable被置于休眠模式(Knockout倾斜所有依赖关系并在读取后重新评估内容)并且计算的observable被置于监听模式(Knockout在第一次访问之前不断检查值是否是最新的) 。
因此,如果您需要执行其他代码,那么最好使用计算的observable。
$expiry = date("Y-m-d");
$queryout = "SELECT appliances.*, tests.* FROM (appliances LEFT JOIN tests
ON appliances.ID = tests.Appliance) WHERE Cli_ID = '$useractiveid'
AND where Next Test Due < '" . $expiry . "'";
运行此代码时,会显示两条警告消息,显示调用pureComputed和computed函数的次数。由于pureComputed处于休眠模式,因此从未访问该函数,并且计数器将显示0.与此相反,计算函数会自动评估数据绑定,导致计数器增加数字并显示1。