通过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)知道何时更新是安全的,但我仍然想知道根本原因,以及可能的更好的解决方案。
答案 0 :(得分:1)
在那里初始化东西应该是安全的。我也使用activate钩子并在那里返回一个promise。不确定哪一个是首选事件。 我猜的根本问题是因为您的Ajax调用缺少承诺。尝试更改,或者至少使用$ .Ajax和async:false。