2012-07-15 84 views
0

我已经创建了一个View Model对象来与KnockoutJS一起使用。在computedObservable中更新observableArray会创建一个循环引用?

它有一个叫做“年”,这是可观察到的数组属性...

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

然后我有一个计算观察到,在这我想更新数组的内容...

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

    // etc... 
}); 

我遇到的问题是,这似乎创建了一个无限循环。我是猜测 Knockout正在检测到我正在访问'年'属性并创建它与'FuturePrediction'属性之间的依赖关系。

只要我尝试修改数组的内容,计算的函数就会再次触发。问题是我所做的只是更新“年份”数组,而不是读取它,因此实际上不是依赖项

任何想法我可以做些什么来解决这个问题?

回答

1

在KO 2.1中,计算的观察对象不能触发自己,所以你在2.1中会更好。

调用数组操作方法会读取和设置数组,因此它会创建一个依赖项。只要您不依赖原始底层数组(任何地方都有引用),您就可以执行viewModel.Years([]);

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

像:

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

    viewModel.Years(result); 
}); 

同样,我不知道您的具体情况,但如果最终的目标是创建基于一些标准的新数组,然后你可以有FuturePrediction是数组和返回它作为计算可观察结果。只是不确定你的情况。

+0

感谢您的回复!我其实刚回到这里说我在你的博客上找到了答案:http://www.knockmeout.net/2012/05/knockout-2-dot-1-is-out.html - 即 - 升级到KO 2.1!再次感谢,并保持良好的工作! :O) – 2012-07-15 13:25:53