【发布时间】:2012-01-18 20:13:04
【问题描述】:
我在使用checked 绑定时遇到问题:单击复选框不会更新可见状态,尽管dependentObservable 表示值已更改。
这是 HTML 片段:
<input type="checkbox"
data-bind="checked: document().selected"
title="Select one or more documents to find more similar ones" >
这绑定到我的 Posting 类的一个实例,该类具有 document() 可观察值。文档类的相关部分如下所示:
function Document(data, topic) {
this.id = ko.observable(data.id);
this.url = ko.observable(data.url);
this.title = ko.observable(data.title);
/** Display state **/
this.selected = ko.observable(false);
ko.dependentObservable(function() {
console.log("Selected " + this.url() + " : " + this.selected());
}, this);
}
当我点击复选框时,控制台会打印如下内容:
Selected http://somedomain.com/doc1.pdf : true
但复选框仍未选中。
我正在使用 jQuery 1.4.2 和淘汰赛 1.2.1
淘汰赛的其他方面似乎工作正常。当我像this 那样在jsffiddle 中隔离问题时,它按预期工作。对我接下来应该测试什么有什么想法吗?
基因
更新:太平洋标准时间 2011 年 12 月 12 日 2:54:
@RP Niemeyer:我还有很多其他dependentObservable 实例;唯一提及selected() 的人看起来像这样:
this.selectedDocuments = ko.dependentObservable( function() {
return this.documents().findAll(function(doc) {return doc.selected()});
}, this);
findAll 做你想做的事。
据我所知,当复选框被触发时,selected observable 被设置为 true,这会触发dependentObservable,它会打印正确的值。但是,视图没有更新。尽管如此,observable 认为它已设置为 true,因为随后单击相同(取消选中)复选框不会产生任何进一步的控制台输出。
太平洋标准时间 2011 年 12 月 12 日晚上 9:45 更新:
我能够在jsfiddle 中重现该问题。如果您编辑封闭 div 上的单击处理程序,复选框将正常工作。是否有解决方法,或者这是一个已知问题?
【问题讨论】:
-
我怀疑这实际上是您的问题,但请确保关闭您的标签。您的
input标签未关闭。这确实会导致 KO 中的其他元素出现问题。 -
我尝试使用
<input />和<input></input>变体,并产生了相同(不正确)的结果。 -
页面上是否有任何其他事件处理程序(实时/委托)或单击复选框时触发的任何其他事件。其他的 HTML 是不是和 fiddle 类似?
-
我添加了描述问题的更多细节。
-
控制台有错误吗?很乐意提供帮助。希望您可以在 jsfiddle 中获得复制,但我知道有时很难从真实的应用程序中提取。当复选框绑定到可观察对象(而不是依赖可观察对象)时,我还没有看到这种特殊类型的问题。其他可能发生这种情况的情况是使用点击绑定而不是选中,但您的情况并非如此。
标签: knockout.js