6

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

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

我应该缓存这个动作吗?还是在computed内部arrayFilter做?

4

1 回答 1

9

计算出的 observables 的值被缓存。它们的值仅在最初和依赖项更改时计算。因此,您可以一遍又一遍地访问该计算的值并始终接收缓存的值。

根据您的评论,听起来您想根据某些参数创建计算出的 observables。该技术的几个注意事项:

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

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

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

因此,如果您仅在绑定中使用 this,那么您可以选择跳过计算并仅使用函数,因为绑定使用其自己的计算 observable。如果您需要从视图模型与其交互,那么您可能希望在此处创建过滤器。

于 2012-08-19T21:35:12.680 回答