Javascript 敲除计算为写入但不读取的可观察对象创建依赖关系
我在“小部件”中有此代码。值是widgets值,另一个是来自应用程序其他地方的数据源。计算出的值创建值订阅,即使它从未被读取。这意味着当我更新值时,将运行comp并将值设置回otherJavascript 敲除计算为写入但不读取的可观察对象创建依赖关系,javascript,knockout.js,Javascript,Knockout.js,我在“小部件”中有此代码。值是widgets值,另一个是来自应用程序其他地方的数据源。计算出的值创建值订阅,即使它从未被读取。这意味着当我更新值时,将运行comp并将值设置回other value = ko.observable(1); // Widgets value other = ko.observable('a'); // Somewhere else in app comp = ko.computed(function () { value(other()); doS
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只运行,如果其他是改变。我看到现在有一个peek函数,但它只用于读取。为什么计算机甚至为一个从未被读取的可观察对象创建订阅?这是非常令人沮丧的。这有什么办法吗
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,而不必手动订阅,这会使小部件复杂化
编辑:
这个问题实际上是我的代码中的一个错误,上面的例子需要简化,但实际上解决了这个问题。如果有兴趣,看看这把小提琴
经过考虑,我们将使用这个模型,而不是纯粹为了副作用而使用计算机。我同意这是他们打算如何使用
new Widget({
id: 'widget',
initial: 5,
value: function () {
return client.get('data');
},
color: function () {
return client.get('data').length ? 'red' : 'green';
}
})
在计算机中设置
值
不会创建订阅。您将订阅other
。唯一的问题是您是否作为doSomethingElse
的一部分访问value
这里有一个小提琴,显示最初计算的值是经过计算的,但在更新值后未进行计算:
我同意@nemesv的观点,即您可能希望在计算机中设置可观测值时小心。您当前的案例应该有效(除非在doSomethingElse
中正在进行的操作)
另一种选择可能是使用手动订阅。如果只想在其他
更改时更新值
,则可以执行以下操作:
other.subscribe(function(newValue) {
value(newValue);
doSomethingElse();
});
对于手动订阅,它只会在特定可观察到的更改时触发,因此您不必担心正在访问哪些依赖项。在计算中设置值
,不会创建订阅。您将订阅other
。唯一的问题是您是否作为doSomethingElse
的一部分访问value
这里有一个小提琴,显示最初计算的值是经过计算的,但在更新值后未进行计算:
我同意@nemesv的观点,即您可能希望在计算机中设置可观测值时小心。您当前的案例应该有效(除非在doSomethingElse
中正在进行的操作)
另一种选择可能是使用手动订阅。如果只想在其他
更改时更新值
,则可以执行以下操作:
other.subscribe(function(newValue) {
value(newValue);
doSomethingElse();
});
对于手动订阅,只有当特定的可观察变化时才会触发,因此,您不必担心正在访问哪些依赖项。一般来说,这不是一个好的做法,因为您的计算机会产生副作用,即设置外部变量。我再次考虑了这一点,并决定我同意我们的副作用计算不是最好的主意,可能会造成混乱,导致不良的工作实践,用它们来设定不该设定的事物。我们将对用户的返回值进行计算,并简单地使用更多的返回值。一般来说,这不是一个好的做法,因为您的计算有副作用,即设置外部变量。我再次考虑了这一点,并决定我同意我们对副作用的计算不是最好的主意,可能会造成混乱,导致工作不好练习(用它们来安排不该安排的事情)。我们将为他们的返回值进行用户计算,并简单地拥有更多的返回值。这很尴尬,很明显我没有检查我自己的示例。我把一把更完整的小提琴放在一起演示这个问题,在这样做的过程中,我意识到了我的错误。Value是一个包装函数,它确实获取并设置了实际的可观察对象,但是包装函数总是读取可观察对象的值!完全监督。这里有一把小提琴给感兴趣的人。很尴尬,很明显我没有检查我自己的例子。我把一把更完整的小提琴放在一起演示这个问题,在这样做的过程中,我意识到了我的错误。Value是一个包装函数,它确实获取并设置了实际的可观察对象,但是包装函数总是读取可观察对象的值!完全监督。这里有一把小提琴给感兴趣的人。