Knockout:如何将Checkbox“checked”值传递给Click处理函数?

时间:2016-09-01 20:57:29

标签: javascript model-view-controller mvvm knockout.js data-binding

我想向点击处理程序发送“true / false”值,具体取决于是否选中了复选框。

  • 在检查时,它应发送第三个参数(isChecked),其值为“true”。
  • 取消选中后,它应发送值为“false”的第3个参数(isChecked)。

我确信这很容易,但我很难搞清楚。 这是输入元素:

<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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

除非您需要区分点击与checked绑定中设置变量的其他方式,否则您不需要点击处理程序。你只想subscribe到变量,它会在值发生变化时执行你的函数。

您已经编写了click绑定,就像将参数添加到参数列表中一样,Knockout会知道要传递什么。你想重新思考一下。通常,最好将您的点击处理程序编写为ViewModel的成员,并将绑定设为click: methodName

以下是复选框上的点击绑定示例。每隔一段时间切换一次复选框。这不会触发点击绑定。

还有一个订阅计算值已更改的时间,以及最后一个值。

&#13;
&#13;
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;
&#13;
&#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;但它的确有效!这样做有什么异议呢?