取消复选框未进行可视化更新

Knockout checkbox not updating visually

本文关键字:可视化 更新 复选框 取消      更新时间:2023-09-26

我在Knockout代码中输入了一个复选框,该复选框正确地更新了视图模型,但在它周围的div消失并重新出现之前不会更新。我们目前使用的是淘汰赛3.2.0。

以下是相关HTML的子集:

<!-- ko foreach: objects -->
<!-- ko if: isType(typeCodes.INPUT) -->
<!-- ko if: selected -->
<div data-bind="fadeVisible: $root.isState(uiState.IDLE)" id="typeInputContainer">
    <!-- ko foreach: $root.types -->
        <div class="checkbox patientType">
            <input type="checkbox" data-bind="attr: {id: 'checkPt' + $data.patientTypeValue() }, checked: $data.visible" />
        </div>
    <!-- /ko -->
</div>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->

下面是视图模型的一个子集:

function PatientType(name, value, color) {
    var self = this;
    self.typeName = ko.observable(name);
    self.visible = ko.observable(true);
    //Disposal
    self.isDisposed = false;
    self.dispose = function() {
        self.color().dispose();
        self.isDisposed = true;
    };
}

对大幅减少表示歉意,但在每种情况下,周围的代码都非常冗长,与问题无关。

当我在调用堆栈的最高级别(用于事件处理的JQuery函数)遍历代码时(如下),单击复选框将导致调用该函数大约五到六次,在第一次调用之后的每一次,复选框都会更改,以正确反映更新的视图模型。

但是,在执行的"线程"完成后,复选框会立即恢复到以前的状态。只有删除div(通过取消选择HTML顶行引用的对象)并重新添加div(通过重新选择它)时,复选框才能正确反映视图模型。

最初,我认为UI更改是由于分配给视图模型中此更新引起的各种更改的多个订阅而停止的,但我发现,当这些订阅被临时删除时,问题仍然存在。应用程序中还有其他复选框,它们的功能与预期相同,编写方式也大致相同。

上面提到的JQuery 2.1.1代码:

eventHandle = elemData.handle = function( e ) {
    // Discard the second event of a jQuery.event.trigger() and
    // when an event is called after a page has unloaded
    return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
        jQuery.event.dispatch.apply( elem, arguments ) : undefined;
    };

以及fadeVisible绑定的定义,如果它是相关的:

ko.bindingHandlers.fadeVisible = {
    init: function (element, valueAccessor) {
        // Initially set the element to be instantly visible/hidden depending on the value
        var value = valueAccessor();
        $(element).toggle(ko.unwrap(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
    },
    update: function (element, valueAccessor) {
        // Whenever the value subsequently changes, slowly fade the element in or out
        var value = valueAccessor();
        ko.unwrap(value) ? $(element).fadeIn() : $(element).fadeOut();
    }
};

任何关于造成这种情况的原因的建议都将不胜感激。

我不知道这是相关的,但我遇到了一个问题,在重新绑定后单选按钮未被选中。修复了我将databind="if:withdatabind="visible:

替换后的问题