Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除计算为写入但不读取的可观察对象创建依赖关系_Javascript_Knockout.js - Fatal编程技术网

Javascript 敲除计算为写入但不读取的可观察对象创建依赖关系

Javascript 敲除计算为写入但不读取的可观察对象创建依赖关系,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

我在“小部件”中有此代码。值是widgets值,另一个是来自应用程序其他地方的数据源。计算出的值创建值订阅,即使它从未被读取。这意味着当我更新值时,将运行comp并将值设置回other

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是一个包装函数,它确实获取并设置了实际的可观察对象,但是包装函数总是读取可观察对象的值!完全监督。这里有一把小提琴给感兴趣的人。