使用淘汰缓存计算值

Cache computed values with knockout

本文关键字:计算 缓存 淘汰      更新时间:2023-09-26

假设我想创建一个函数,循环数组(observableArray)中的所有元素,并从数组中返回适当的项。

我正在考虑创建一个computed函数来处理这个问题,并使用ko.utils.arrayFilter进行过滤。

我应该缓存此操作吗?还是computedarrayFilter在内部执行?

计算的可观测值被缓存。它们的值仅在初始和依赖关系发生变化时计算。因此,您可以一次又一次地访问该计算的值,并始终接收缓存的值。

根据你的评论,听起来你想根据某些参数创建计算的可观察性。该技术的几个注意事项:

  • 单个元素的绑定在计算的可观察对象内部执行,以跟踪依赖关系。这意味着,如果你只想在UI中使用过滤器,那么你实际上可以避免创建计算的可观察对象,只需直接调用过滤器函数。每当依赖项发生更改时,绑定就会触发,函数就会再次运行。如果您还想以编程方式与过滤后的数据进行交互,那么这不是最好的解决方案。以下是一个示例:http://jsfiddle.net/rniemeyer/QSgPz/

  • 如果你要经常使用这个概念,那么你甚至可以扩展observableArray,直接从observableArray中调用过滤器,比如:http://jsfiddle.net/rniemeyer/VhCVc/

  • 作为一种选择,如果您有一个返回计算结果本身的函数,那么您需要确保对所需的每个计算的过滤器只调用一次。您不希望从绑定中调用它,因为每次触发绑定时都会重新创建它(除非您有一个在init中正确处理它的自定义绑定)。以下是一个示例:http://jsfiddle.net/rniemeyer/JrHnT/.同样,如果您经常使用observableArrays,您可以扩展它,以便能够为您创建一个计算的数组。

因此,如果您只使用绑定中的这个,那么您可以选择跳过计算,只使用一个函数,因为绑定使用自己的计算可观察对象。如果您需要从视图模型中与它交互,那么您可能希望在那里创建过滤器。