我正在玩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);
我该如何解决这个问题,但仍然有消息取决于页面和标签?
答案 0 :(得分:3)
切换到AngularJS。 Angular的数据绑定比Knockout好得多。你在这里遇到的无限循环等问题很大程度上是由于Knockout需要可观察的包装器。
Angular不需要对象的可观察包装器。 Angular可以观察任何标准的JSON / Javascript对象,并通过MVVM直接数据绑定到任何HTML元素。
在Angular中,您只需对ViewModel.messages进行AJAX调用,标准JSON将应用于您的ViewModel.messages属性。没有可观察到的包装。这消除了对ko.dependentObservable()的需要,从而消除了无限循环。
答案 1 :(得分:1)
在第二个例子中(对于代码片段而言,这是一个很长的时间),你有这个:
viewModel.messages = ko.dependentObservable(function () {
...
data: ko.toJSON(viewModel),
...
如果对ko.toJSON
的调用试图获取视图模型上所有可观察属性的值,它将尝试评估viewModel.messages属性。这会再次调用ko.toJSON
,导致无限循环。