Knockout可观察绑定仅在第一次ajax调用后更新

Knockout observable binding only update after first ajax call

本文关键字:ajax 调用 更新 第一次 观察 绑定 Knockout      更新时间:2023-09-26

使用Knockout via Durandal(v.1.2)Knockout Observable在作为AJAX调用的结果更新后不会更新绑定,第一次除外。

ViewModel:

define(["require", "exports"], function(require, exports) {
    var About = (function () {
        function About() {
            var _this = this;
            this.Code = ko.observable("Initial Content");
            $.get("MyXml.xml", function (data) {
                return _this.DataLoaded(data);
            }, "text");
        }
        About.prototype.DataLoaded = function (data) {
            this.Code(data.toString());
        };
        return About;
    })();

    return About;
});

视图:

<div>
    <h2>About</h2>
    <p data-bind="text: Code"></p>
</div>

视图模型通过Durandals composer绑定到视图,但我在香草淘汰赛中遇到了同样的问题。第一次合成视图时会正确显示文件的内容,但之后再次合成视图时,绑定在初始值之后不会更新。加载文件,并调用用于更新可观察的代码,不会引发错误。以前,我只是通过使用setInterval延迟更新来解决这个问题。再加上它第一次工作的事实,对我来说,这表明它是一个种族条件错误。但我不知道问题出在哪里。

有没有什么时间段不应该更新可观察到的?有没有一个好的模式可以避免这种情况?

编辑

目前,我正在使用viewAttached方法(Durandal)来了解何时可以安全更新,但我仍然想知道根本原因,以及任何更好的解决方案。

初始化东西应该是安全的。我也使用激活钩子,并在那里返回一个承诺。不确定哪一个是首选活动。根本问题可能是因为Ajax调用缺少承诺。尝试至少将$.Ajaxasync: false一起使用。