2011-12-12 93 views
3

我遇到了checked绑定问题:点击复选框不会更新可见状态,尽管依赖关系可见性指示值已更改。knockoutjs检查绑定

下面是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 PST:

@RP尼迈耶:我有很多其他dependentObservable实例;该metnions selected()唯一一个看起来是这样的:

this.selectedDocuments = ko.dependentObservable(function() { 
    return this.documents().findAll(function(doc) {return doc.selected()}); 
}, this); 

findAll做什么你mighht认为。

据我所知,发生的情况是,当复选框被触发时,selected observable被设置为true,触发复选框,从而触发dependentObservable,它打印正确的值。但是,视图不会更新。尽管如此,observable认为它被设置为true,因为随后在同一个(取消选择的)复选框上的点击不会产生任何进一步的控制台输出。

UPDATE 2011年12月12日,下午9:45 PST:

我能够重现这一jsfiddle问题。如果您编辑封闭div上的点击处理程序,则复选框将正常工作。有没有解决办法,或者这是一个已知的问题?

+0

我怀疑这实际上是你的问题,但要确保您关闭标签。你的'input'标签没有关闭。这确实会导致KO与其他元素的问题。 –

+0

我尝试使用''和''变种,并产生相同(不正确)的结果。 –

+0

你有任何其他事件处理程序在页面上(实时/委托)或任何其他点击复选框时触发。其他HTML与小提琴类似吗? –

回答

4

OK - 更新它是有道理的。你可以做的是return true;来自外部div上的点击处理程序。这将允许默认操作继续。

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

+0

工程就像一个魅力!感谢你的帮助! –

+0

我应该总是从ko点击处理程序“返回true”吗? 如何使用“clickBubble:false”选项? –

+0

@AsleG - 它们有略微不同的目的。返回'true'将允许默认行为发生(实际上是'event.preventDefault')。所以,当你点击一个链接时,它会导航,等''clickBubble:true'将允许点击事件冒泡到父元素('event.stopPropagation')上的处理程序。希望有所帮助! –