开发者

Loading data with dependentObservable causing an infinite loop

I'm playing around with Knockout and now trying to use the Knockout address plugin (based on jQuery address).

This code below works, except that when I try entering the address the linkObservableToUrl provides the page is loaded without the right tags. I guess something is wrong in the way I'm loading the messages, but I'm not sure how this should be done using the Knockout framework.

I've got the following code, which is causing an infinite loop:

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

viewModel.filterTags = function (filterTags) {
    viewModel.tags(filt开发者_开发百科erTags);
};

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

ko.applyBindings(viewModel);

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

How can I solve this and still have the messages depend on page and tags?


Switch to AngularJS. Angular's databinding is much better than Knockout's. Much of the problems you are encountering here with infinite loops, etc. are due to Knockout's need for observable wrappers.

Angular does not require observable wrappers of your objects. Angular can observe any standard JSON/Javascript object, and databind directly to any HTML element via MVVM.

In Angular, you would simply make your AJAX call for ViewModel.messages, and the standard JSON would be applied to your ViewModel.messages property. No observable wrappers. This eliminates the need for ko.dependentObservable() and thus - removes your infinite loop.

http://www.angularjs.org


In the second example (which is quit long for a code snippet) you have this:

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

If the call to ko.toJSON tries to get the value of all the observable properties on the view model, it will try to evaluate the viewModel.messages property. That will call ko.toJSON again, leading to an infinite loop.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜