在computedObservable中更新observableArray会创建循环引用吗?

时间:2012-07-15 12:06:15

标签: knockout.js

我创建了一个View Model对象,用于KnockoutJS。

它有一个名为'Years'的属性,它是一个可观察的数组......

viewModel.Years = ko.observableArray([]);

然后我有一个计算的observable,我想在其中更新数组的内容......

viewModel.FuturePrediction = ko.computed(function () {
    viewModel.Years.removeAll();

    // etc...
});

我遇到的问题是,这似乎会产生无限循环。我猜测 Knockout正在检测我正在访问'Years'属性并在它和'FuturePrediction'属性之间创建依赖关系。

一旦我尝试修改数组的内容,就会再次触发计算的函数。问题是,我所做的只是更新'Years'数组,而不是读取它 - 因此实际上不是依赖

我可以做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:1)

在KO 2.1中,计算出的观察者不能自己触发,所以2.1版本会更好。

调用数组操作方法会读取并设置数组,因此会创建依赖项。你可以做viewModel.Years([]);,只要你不依赖原始的底层数组(在其他地方引用它)。

我不确定你的完整情况,但是一个选项是建立你的“新”数组,然后最终将结果设置为Years的值而不是先清除它。

像:

viewModel.FuturePrediction = ko.computed(function () {
    var result = [];
    //add things to result

    viewModel.Years(result);
});

同样,我不确定您的具体情况,但如果最终目标是根据某些条件创建新数组,那么您可以将FuturePrediction作为数组并将其作为结果返回计算可观察。只是不确定你的情况。