我正在使用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 SOMETIMES中(约1/10的机会)。切换视图后,所有这些都会发生,并启用转换。 调查显示,在更改该属性时,DOM包含先前的视图,没有“当前”元素的痕迹,包括被绑定的元素。
答案 0 :(得分:0)
好的,我自己找到了解决方案。问题是由杜兰达尔过渡造成的。这种效果以某种方式影响了DOM的生成,并且在数据绑定时尚未准备就绪。所以淘汰赛试图订阅UI元素,这些元素实际上并不存在。当他们最终准备好时,已经执行了'绑定',有0个订阅