2012-06-24 61 views
4

我有一些复选框绑定到我的模型中的数组。这很好,当你检查一个盒子时,数组会相应地更新。Knockoutjs复选框更改事件

但是,如果值已更改,我希望在我的模型上调用一个方法来过滤给定新值的结果。我试图把变化事件联系起来,但是这似乎具有变化之前的值而不是变化之后的值。

我已经说明了我的问题在jsfiddle http://jsfiddle.net/LpKSe/这可能会使这更有意义。

为了完整,我的代码在这里重复。

JS

function SizeModel() { 
    var self = this; 
    self.sizes = ko.observableArray(["small", "medium", "large"]); 
    self.sizes2 = ko.observableArray(["small", "medium", "large"]); 
    self.getResults = function(e) { 
     alert(self.sizes()); 
    }; 
    self.getResults2 = function(e) { 
     alert(self.sizes2()); 
    }; 
} 

$(document).ready(function() { 
    sizeModel = new SizeModel(); 

    ko.applyBindings(sizeModel); 
});​ 

的Html

<h3>Size 
    <input type="checkbox" value="small" data-bind=" checked: sizes, event:{change: getResults}"/> 
    <span class='headertext'>Small</span> 
    <input type="checkbox" value="medium" data-bind=" checked: sizes, event:{change: getResults}" /> 
    <span class='headertext'>Medium</span> 
    <input type="checkbox" value="large" data-bind=" checked: sizes, event:{change: getResults}" /> 
    <span class='headertext'>Large</span> 
</h3> 
<h3>Size 
<input type="checkbox" value="small" data-bind=" checked: sizes2, event:{click: getResults2}"/> 
<span class='headertext'>Small</span> 
<input type="checkbox" value="medium" data-bind=" checked: sizes2, event:{click: getResults2}" /> 
<span class='headertext'>Medium</span> 
<input type="checkbox" value="large" data-bind=" checked: sizes2, event:{click: getResults2}" /> 
<span class='headertext'>Large</span> 
</h3> 

回答

14

您不需要更改事件。如果您订阅observableArray,您将在它发生更改时收到通知,并通过更新阵列:http://jsfiddle.net/jearles/LpKSe/53/

function SizeModel() { 
    var self = this; 
    self.sizes = ko.observableArray(["3", "2", "1"]); 
    self.sizes.subscribe(function(updated) { 
     alert(updated); 
    }); 
} 
0

在你拨弄你错过了逗号你data-bind -s,这里有一个固定的例子:http://jsfiddle.net/4aau4/1/

重的问题 - 它可能或者是一个KnockoutJS相关的问题(也就是说在change事件被触发后更新observableArray),或者类似于我的藏在前段时间:Checkboxes are being checked before click handler is even called

编辑:

什么艰难的星期天,我觉得我还没有清醒:)

看看这个片断:http://jsfiddle.net/4aau4/2/ - 它看起来像DOM被正确更新,并且它是滞后的ko.observableArray。 ($('input:checked').length表示实际检查了多少个复选框)。