-1

我正在使用 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">&times;</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 包含以前的视图,没有任何“当前”元素的痕迹,包括被绑定的元素。

4

1 回答 1

0

好的,我自己找到了解决方案。这个问题是由杜兰达尔过渡引起的。这种效果在某种程度上影响了 DOM 的生成,并且在数据绑定时它还没有准备好。因此,knockout 尝试订阅 UI 元素,但实际上并不存在。当他们最终准备好时,已经执行了“绑定”,有 0 个订阅

于 2013-08-14T07:38:09.063 回答