2012-07-15 21 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