使用dependentObservable加载数据导致无限循环

时间:2011-08-27 18:59:54

标签: javascript jquery knockout.js jquery.address

我正在玩Knockout,现在尝试使用Knockout地址插件(基于jQuery地址)。

以下代码有效,但当我尝试输入地址时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);

我该如何解决这个问题,但仍然有消息取决于页面和标签?

2 个答案:

答案 0 :(得分:3)

切换到AngularJS。 Angular的数据绑定比Knockout好得多。你在这里遇到的无限循环等问题很大程度上是由于Knockout需要可观察的包装器。

Angular不需要对象的可观察包装器。 Angular可以观察任何标准的JSON / Javascript对象,并通过MVVM直接数据绑定到任何HTML元素。

在Angular中,您只需对ViewModel.messages进行AJAX调用,标准JSON将应用于您的ViewModel.messages属性。没有可观察到的包装。这消除了对ko.dependentObservable()的需要,从而消除了无限循环。

http://www.angularjs.org

答案 1 :(得分:1)

在第二个例子中(对于代码片段而言,这是一个很长的时间),你有这个:

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

如果对ko.toJSON的调用试图获取视图模型上所有可观察属性的值,它将尝试评估viewModel.messages属性。这会再次调用ko.toJSON,导致无限循环。