knockout.js 计算的可观察值立即释放,为什么?

问题描述 投票:0回答:1

这是淘汰赛中计算可观察量的一个非常基本的示例:

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'
然后它突然起作用了。但这是愚蠢的!如果我只想要一个可观察变量,我会使用它。相反,我使用计算型,因为它与某些系统资源(例如数据库)交互,并且写入将更改数据库中的值,然后读取应该给出该值。如果数据库值发生变化,某些内容可能会显式触发计算为脏数据以强制重新评估,这将是以后的问题。

现在我注意到似乎根本没有办法让评估工作,因为它被认为是已处理!

javascript knockout.js computed-observable
1个回答
0
投票
如果这段代码正是您的情况,那么您刚刚重新创建了一个基本的可观察对象。并且根本不需要计算。也有可能是我们想太多了。

正如您在问题的第二部分中注意到的那样。如果“价值”是可观察到的,它就有效。这对我来说是有道理的,因为您正在尝试观察该变量的任何变化,只需更多步骤。

开销很小而且很容易。我想说就这么做吧,就像淘汰赛一样。无论如何,淘汰赛已经相对过时了。我仍然在旧版应用程序中一直使用它。但它绝对不完美。我一直致力于尽可能用更新的东西替换它。

也有可能 ko“订阅”比 ko“计算”更适合您的需求。因为看起来你正试图让一件事依赖于另一件事。

© www.soinside.com 2019 - 2024. All rights reserved.