我想向点击处理程序发送“true / false”值,具体取决于是否选中了复选框。
我确信这很容易,但我很难搞清楚。 这是输入元素:
<input class="cards-view--item-checkbox pull-right" type="checkbox"
data-bind="value: universalParcelId, checked: $parent.isChecked, checkedValue: true,
click: function(data, event, isChecked) {
return $root.addUPIDtoArray(data, event, $parent.isChecked()) }">
点击处理程序:
addUPIDtoArray: function (data, event, isChecked) {
var self = this;
self.isChecked = ko.observable();
// If checked
if(isChecked()) {
self.upIDArray.push(data.universalParcelId);
self.upIDWithIndexArray.push({
universalParcelID: data.universalParcelId,
searchResultIndex: data.searchResultIndex
});
// If unchecked
} else if(!isChecked()) {
// remove from array
}
return true; // allow the default "click" action, which is checking the box with a "check"
},
我以为我可以使用“event”参数,但由于某种原因它会以jQuery.event的形式出现,而不是常规的DOM事件。所以我决定第3个参数。但它不会像这样工作:给出错误$parent.isChecked is not a function
有什么想法吗?
答案 0 :(得分:2)
除非您需要区分点击与checked
绑定中设置变量的其他方式,否则您不需要点击处理程序。你只想subscribe
到变量,它会在值发生变化时执行你的函数。
您已经编写了click
绑定,就像将参数添加到参数列表中一样,Knockout会知道要传递什么。你想重新思考一下。通常,最好将您的点击处理程序编写为ViewModel的成员,并将绑定设为click: methodName
。
以下是复选框上的点击绑定示例。每隔一段时间切换一次复选框。这不会触发点击绑定。
还有一个订阅计算值已更改的时间,以及最后一个值。
vm = {
box: ko.observable(true),
changes: ko.observable(0),
lastChange: ko.observable(''),
stuff: ko.observableArray(),
doThing: function() {
vm.stuff.push(vm.box() ? 'checked' : 'not');
return true;
}
};
vm.box.subscribe(function(newValue) {
vm.changes(vm.changes() + 1);
vm.lastChange(newValue ? 'checked' : 'not');
});
ko.applyBindings(vm);
// This will change the checkbox without firing the click
setInterval(function() {
vm.box(!vm.box());
}, 1000);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="checkbox" data-bind="checked: box, click: doThing" />
<div>Changes: <span data-bind="text:changes"></span>, last:<span data-bind="text:lastChange"></span>
<div data-bind="foreach:stuff">
<div data-bind="text: $data"></div>
</div>
&#13;
答案 1 :(得分:2)
我利用$element.checked
将其作为参数传递给我的点击处理函数
<input style="display: none;" class="cards-view--item-checkbox pull-right" type="checkbox"
data-bind="value: universalParcelId, checked: $parent.isChecked, click: function(data, event) {
return $root.addUPIDtoArray($element.checked, data, event) }">
可能不是&#34;最佳实践&#34;但它的确有效!这样做有什么异议呢?