【发布时间】:2014-12-04 15:15:52
【问题描述】:
我的 Knockout 代码中的复选框输入有问题,该复选框可以正确更新视图模型,但直到围绕它的 div 消失并重新出现时才会更新。我们目前使用的是 Knockout 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 顶行引用的对象)并重新添加(通过重新选择它)时,复选框才能正确反映视图模型。
最初,我认为 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();
}
};
任何有关可能导致此问题的建议都将不胜感激。
【问题讨论】:
-
fadeVisiblediv 在哪里关闭?是什么控制选择/取消选择。 My fiddle. -
什么版本的淘汰赛?
-
是否可以提供一个演示问题的jsfiddle?
-
@Originiell 一个对象被取消/选择取决于它的屏幕表示是否已被点击——该应用程序还使用 JsPlumb,我没有包含的代码,因为我没有不认为它是相关的。至于 div 关闭,我忘了添加它 - 现在已经更正了。 Michael,我们正在使用 Knockout 3.2.0,感谢您的提问。我已经用这些信息更新了这个问题。不幸的是,该项目使用了如此多的库,以至于将其减少到在 JsFiddle 中可能有意义的东西不会复制问题。
标签: javascript jquery checkbox knockout.js