使用knockout缓存计算值

时间:2012-08-19 11:59:44

标签: javascript knockout.js knockout-2.0

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

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

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

1 个答案:

答案 0 :(得分:9)

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

根据您的评论,听起来您想要根据某些参数创建计算的可观察量。这种技术的几个注意事项:

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

  • 如果您要经常使用此概念,那么您甚至可以扩展observableArrays以直接从observableArray调用过滤器,例如:http://jsfiddle.net/rniemeyer/VhCVc/

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

所以,如果你只是从绑定中使用它,那么你可以选择跳过计算并只使用一个函数,因为绑定使用它自己的计算observable。如果您需要从视图模型中与它进行交互,那么您可能希望在那里创建过滤器。