【发布时间】:2013-01-14 06:14:54
【问题描述】:
有没有好办法大致实现如下概念:
var computed = ko.computed(function() {
readSomeObservables(); //<-- if these change, notify computed
ko.stopCollectingDependencies();
readSomeMoreObservables(); //<-- if these change, do not notify computed
ko.resumeCollectingDependencies();
});
我知道peek(),但在这种情况下,计算是调用从外部模块提供的方法,如果这些方法碰巧涉及可观察对象,设计要求它纯粹是偶然的。
我有一个解决办法,大致是这样的:
window.setTimeout(function() {
readSomeMoreObservables();
}, 0);
但由于显而易见的原因,这并不理想,并且在某些情况下会导致不良行为。
【问题讨论】:
-
如果你不希望它在这些变化时更新,你为什么要从计算中读取它们?
-
我将重申问题中所说的内容:情况相当复杂,因为外部模块可以提供需要在特定点调用的额外回调执行流程,但如果这些回调碰巧涉及从 observables 读取,那么这些 observables 不应该参与计算。所以我可以重新设计整个模块(昂贵)或找到解决方法(便宜)。
-
所以当那些改变时计算不需要发布给它的订阅者?对吗?
-
@Anders close - 计算对象首先不应该订阅那些 observables;因为它不能重新评估自己的读取功能,更不用说通知它的订阅者了。
-
您不能让 readSomeMoreObservables 背后的团队将其扩展为使用 peek 或标准读取?
标签: knockout.js computed-observable