这是淘汰赛中计算可观察量的一个非常基本的示例:
let value = 'hello';
const co = ko.computed({
read: function() { return value; },
write: function(arg) { value = arg; }
});
console.log(co()); // Outputs 'hello'
co('bye'); // Update the value
console.log(value); // Outputs 'bye'
console.log(co()); // Still outputs 'hello' when value is already set to 'bye'
我追踪到这个问题,发现co的状态立即是isDispose = true,所以它被处置了。但为什么?由谁来?
即使我在创建它后立即订阅它,它仍然会立即被处置并且不起作用。
我想也许我必须以某种方式 applyBindings,但我将这个问题隔离到我实际执行 applyBindings 的地方(至少在某些时候)。如果这个计算结果立即被处理,我还能如何首先设置一个 ViewModel(他们这么称呼它)然后绑定它?
现在如果我也将值设为可观察值
let value = ko.observable('hello');
const co = ko.computed({
read: function() { return value(); },
write: function(arg) { value(arg); }
});
console.log(co()); // Outputs 'hello'
co('bye'); // Update the value
console.log(co()); // Outputs 'bye'
然后它突然起作用了。但这是愚蠢的!如果我只想要一个可观察变量,我会使用它。相反,我使用计算型,因为它与某些系统资源(例如数据库)交互,并且写入将更改数据库中的值,然后读取应该给出该值。如果数据库值发生变化,某些内容可能会显式触发计算为脏数据以强制重新评估,这将是以后的问题。现在我注意到似乎根本没有办法让评估工作,因为它被认为是已处理!
正如您在问题的第二部分中注意到的那样。如果“价值”是可观察到的,它就有效。这对我来说是有道理的,因为您正在尝试观察该变量的任何变化,只需更多步骤。
开销很小而且很容易。我想说就这么做吧,就像淘汰赛一样。无论如何,淘汰赛已经相对过时了。我仍然在旧版应用程序中一直使用它。但它绝对不完美。我一直致力于尽可能用更新的东西替换它。
也有可能 ko“订阅”比 ko“计算”更适合您的需求。因为看起来你正试图让一件事依赖于另一件事。