2011-08-27 40 views
1

我在玩Knockout,現在試圖使用Knockout地址插件(基於jQuery地址)。使用dependencyObservable加載數據導致無限循環

下面的代碼工作,除了當我嘗試輸入地址linkObservableToUrl提供的頁面加載沒有權利tags。我猜加載郵件的方式是錯誤的,但我不知道如何使用Knockout框架來完成這項工作。

我有下面的代碼,這是造成一個無限循環:

var viewModel = { 
    page: ko.observable(1), 
    //messages: ko.observableArray([]), 
    tags: ko.observable() 
}; 

viewModel.filterTags = function (filterTags) { 
    viewModel.tags(filterTags); 
}; 

viewModel.messages = ko.dependentObservable(function() { 
    $.ajax(
     // abbreviated 
     data: ko.toJSON(viewModel), 
     // abbreviated 
)}, viewModel); 

ko.applyBindings(viewModel); 

ko.linkObservableToUrl(viewModel.tags, "tags", null); 

我怎樣才能解決這個問題,仍然有消息取決於頁面和標籤上?

回答

1

在第二個例子(這是長期戒菸代碼段),你有這樣的:

viewModel.messages = ko.dependentObservable(function() { 
... 
     data: ko.toJSON(viewModel), 
... 

如果調用ko.toJSON試圖獲得對視圖模型的所有觀察到的屬性的值,它將嘗試評估viewModel.messages屬性。這將再次調用ko.toJSON,導致無限循環。

+0

10x,是他們獲取除消息屬性之外的所有可觀察屬性的JSON的簡單方法嗎? –

+0

我不知道這樣做的好方法。您可以將視圖模型分成一個部分發送到服務器,另一部分不發送,但是我的首選是在發出ajax請求時顯式地從視圖模型中提取所需的屬性。您將來可能會在視圖模型中添加更多內容,而這些內容不需要發送到服務器。 (即,遵循數據傳輸對象(DTO)模式,而不是試圖發送整個視圖模型) – Douglas

3

切換到AngularJS。 Angular的數據綁定比Knockout好得多。大部分遇到無限循環等問題都是由於Knockout需要可觀察的包裝。

Angular不需要可觀察的對象包裝。 Angular可以觀察任何標準的JSON/Javascript對象,並通過MVVM直接將數據綁定到任何HTML元素。

在Angular中,您只需對ViewModel.messages進行AJAX調用,並將標準JSON應用於您的ViewModel.messages屬性。沒有可觀察的包裝。這消除了對ko.dependentObservable()的需求,從而消除了無限循環。

http://www.angularjs.org

+0

謝謝,我會看看它。 –