Knockout observable绑定仅在第一次ajax调用后更新

时间:2013-07-19 15:57:23

标签: javascript mvvm knockout.js durandal

通过Durandal使用Knockout(v.1.2),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延迟更新来解决问题。结合它第一次运作的事实,对我来说这是一个竞争条件错误。但我无法弄清楚问题会是什么。

是否有任何时间段您不应更新可观察量?是否有一个很好的模式来避免这种情况?

修改

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

1 个答案:

答案 0 :(得分:1)

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