使用knockout缓存计算值

Iga*_*lSt 6 javascript knockout-2.0 knockout.js

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

我正在考虑创建一个computed处理此功能的函数,并使用它ko.utils.arrayFilter来进行过滤.

我应该缓存此操作吗?抑或是computedarrayFilter做内部?

RP *_*yer 9

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

根据您的评论,听起来您想要根据某些参数创建计算的observable.这种技术的两个考虑因素:

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

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

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

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