我在“小部件”中有此代码。值是小部件的值,其他是应用程序其他位置的数据源。即使从未读取过,计算所得的值也会创建一个值的订阅。这意味着当我更新值时,将运行comp并将值重新设置为其他值。
value = ko.observable(1); // Widgets value
other = ko.observable('a'); // Somewhere else in app
comp = ko.computed(function () {
value(other());
doSomeThingElse();
});
value(2);
// comp is run
value() === 'a'; // true
基本上,我需要comp仅在其他更改时才能运行。我看到现在有一个偷看功能,但这仅用于读取。为什么计算式甚至为从未读过的可观察项创建订阅?这非常令人沮丧。有没有办法解决?
comp函数用于小部件上以从外部源设置其数据,小部件的实际布局为:
new Widget({
id: 'widget',
initial: 5,
observables: {
data: function () {
var data = client.get('data'); // observable
this.value(data);
this.color(data.length ? 'red' : 'green');
}
}
})
创建窗口小部件时,它将根据observables.data进行新的计算。我们希望保留此简单的api,而无需进行手动订阅,这会使小部件变得复杂。
编辑:问题实际上是我的代码有一个错误,以上示例被简化,但实际上消除了该问题。如果对http://jsfiddle.net/dominata/hu6Fr/感兴趣,请参阅此小提琴。
考虑之后,我们将使用此模型,而不是纯粹出于副作用而使用计算。我同意这更多是打算使用它们的方式。
new Widget({
id: 'widget',
initial: 5,
value: function () {
return client.get('data');
},
color: function () {
return client.get('data').length ? 'red' : 'green';
}
})
value
在您的计算中设置不会创建订阅。您将订阅other
。唯一的问题是,如果您value
作为的一部分进行访问doSomethingElse
。
这是一个小提琴,它表明最初对计算值进行了评估,但在更新后未进行评估value
:http : //jsfiddle.net/rniemeyer/exV92/
我同意@nemesv,您可能要在计算中设置可观察值时要小心。您当前的情况应该可以正常工作(除非在中进行操作doSomethingElse
)。
另一种选择是使用手动订阅。如果只想value
在other
更改时进行更新,则可以执行以下操作:
other.subscribe(function(newValue) {
value(newValue);
doSomethingElse();
});
使用手动订阅,它将仅在特定的可观察到的更改时触发,因此您不必担心要访问哪些依赖项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句