2012-06-24 60 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表示實際檢查了多少個複選框)。