【问题标题】:knockoutjs checked bindingknockoutjs 检查绑定
【发布时间】: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 中的其他元素出现问题。
  • 我尝试使用 &lt;input /&gt;&lt;input&gt;&lt;/input&gt; 变体,并产生了相同(不正确)的结果。
  • 页面上是否有任何其他事件处理程序(实时/委托)或单击复选框时触发的任何其他事件。其他的 HTML 是不是和 fiddle 类似?
  • 我添加了描述问题的更多细节。
  • 控制台有错误吗?很乐意提供帮助。希望您可以在 jsfiddle 中获得复制,但我知道有时很难从真实的应用程序中提取。当复选框绑定到可观察对象(而不是依赖可观察对象)时,我还没有看到这种特殊类型的问题。其他可能发生这种情况的情况是使用点击绑定而不是选中,但您的情况并非如此。

标签: knockout.js


【解决方案1】:

好的-有了更新就有意义了。您可以做的是来自外部 div 上的单击处理程序的return true;。这将允许执行默认操作。

http://jsfiddle.net/rniemeyer/SbuEV/8/

【讨论】:

  • 像魅力一样工作!感谢您的所有帮助!
  • 我应该总是从 ko 点击处理程序“返回真实”吗?使用“clickBubble: false”选项怎么样?
  • @AsleG - 它们的用途略有不同。返回 true 将允许默认操作发生(实际上是 event.preventDefault )。因此,当您单击链接时,它将导航,等等。clickBubble: true 将允许单击事件冒泡到父元素上的处理程序 (event.stopPropagation)。希望有帮助!
猜你喜欢
  • 2013-05-02
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多