我的模型中有一些绑定到数组的复选框。这非常有用,当您选中一个框时,数组会相应更新。
但是当值发生变化时,我希望在我的模型上调用一个方法来过滤给定新值的结果。我已经尝试连接更改事件,但这似乎在更改之前而不是在更改之后具有值。
我在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>
答案 0 :(得分: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);
});
}
答案 1 :(得分:0)
在你的小提琴中你错过了data-bind
- s中的逗号,这是一个固定的例子:http://jsfiddle.net/4aau4/1/
重新解决问题 - 它可能是与KnockoutJS相关的问题(即它在change
事件被触发后更新observableArray),或者类似于我之前粘贴的内容:{{3} }
修改强>
多么艰难的星期天,我想我仍然没有醒来:)
请看一下这个代码段:Checkboxes are being checked before click handler is even called - 看起来DOM已正确更新,而ko.observableArray
落后了。 ($('input:checked').length
表示实际检查了多少个复选框。