【问题标题】:Knockout observable binding only update after first ajax call淘汰赛可观察绑定仅在第一次 ajax 调用后更新
【发布时间】:2013-07-18 23:58:37
【问题描述】:

通过 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 时遇到了同样的问题。 文件的内容在第一次组合视图时正确显示,但是当再次组合视图时,绑定在初始值之后不会更新。加载文件,并调用更新 observable 的代码,没有抛出错误。 以前我只是通过使用 setInterval 延迟更新来解决问题。再加上它第一次工作的事实,对我来说这是一个竞争条件错误。但我不知道问题出在哪里。

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

编辑

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

【问题讨论】:

    标签: javascript mvvm knockout.js durandal


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2021-09-19
      • 2013-05-01
      • 2018-03-30
      • 2015-02-26
      • 2015-05-31
      • 2013-03-12
      相关资源
      最近更新 更多