2

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

视图模型:

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 作曲家绑定到视图,但我在使用 vanilla Knockout 时遇到了同样的问题。文件的内容在第一次组合视图时正确显示,但是当再次组合视图时,绑定在初始值之后不会更新。文件被加载,更新可观察的代码被调用,没有抛出错误。以前我只是通过使用 setInterval 延迟更新来解决问题。再加上它第一次工作的事实,我认为这是一个竞争条件错误。但我无法弄清楚问题是什么。

是否有任何时间段不应该更新 observable?有没有一个好的模式来避免这种情况?

编辑

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

4

1 回答 1

1

在那里初始化东西应该是安全的。我还使用了 activate 钩子并在其中返回了一个承诺。不确定哪一个是首选事件。我猜的根本问题是因为您的 Ajax 调用缺乏承诺。尝试更改或至少使用带有 async: false 的 $.Ajax。

于 2013-08-02T22:41:36.757 回答