我正在使用 Durandal 框架来开发一个网站。UI 通过 knockout.js 进行数据绑定。有时我会偶然遇到以下问题:UI 元素丢失了对模型数据(计算值)的订阅,因此 UI 不会像通常那样更新。尽管如此,绑定的计算属性仍然正确更改 - 情况是丢失了与 UI 本身的绑定。调试器显示,在更改属性后,内部淘汰订阅集合为空。
--
好的,添加一些代码,虽然我敢肯定它不会说明任何事情。小部件控制器:
define(function () {
var model = function (element, settings) {
var self = this;
this.widget = settings.widget;
var staticTitle = this.widget.staticTitle;
this.contentTitle = ko.observable('');
this.title = ko.computed(function () {
var dynamicTitle = (self.widget.title && self.widget.title());
return (dynamicTitle ? staticTitle + ': ' + dynamicTitle : staticTitle);
});
小部件视图:
<div data-bind="template: { afterRender: afterRender }" class="widget ui-widget-content">
<div class="ui-widget-header" id="__header" data-bind="text: title"></div>
<button class="close" data-bind="click: close">×</button>
<div class="widget-content">
<!--ko widget: { kind: widget.kind, model: widget } --><!--/ko-->
</div>
</div>
因此,__header 是绑定到 title() 计算值的元素。在其他地方,我通过更改底层小部件的标题来更改标题:
title(someValue);
事实是,应绑定到 UI 的计算出的 title 属性已正确更新。正如预期的那样。但它有时不会反映在 UI 中(大约 1/10 的机会)。所有这一切都发生在切换视图并启用转换之后。调查显示,在更改该属性时,DOM 包含以前的视图,没有任何“当前”元素的痕迹,包括被绑定的元素。