javascript - 如何在knockout js中为checkbox绑定(bind)change事件?

标签 javascript knockout.js

我正在使用引导开关将复选框显示为一个开关,我想将一个函数绑定(bind)到这个开关,所以 click 数据绑定(bind)在这里没有帮助,因为复选框没有被点击。 所以我可能需要一个“更改”数据绑定(bind),例如复选框具有的 onChange 事件,但是当我尝试将 change 事件数据绑定(bind)到复选框时它不起作用...

这是我的数据绑定(bind):

<input type="checkbox" onText="Active" offText="Inactive" 
       data-bind="bootstrapSwitchOn: ActiveFlag, change: function() { UpdateStatus() }" />

开关是这样呈现复选框的:

<div class="has-switch" tabindex="0"
     <div class="switch-on">
          <span class="switch-left">Active</span
          <label>&nbsp;</label
          <span class="switch-right">Inactive</span>
          <input type="checkbox" ontext="Active" offtext="Inactive"
                 data-bind="bootstrapSwitchOn: ActiveFlag, change: function() { UpdateStatus() }">
     </div>
</div>

复选框得到 display:"none" 所以它没有被点击但是当点击开关时它的状态会改变

最佳答案

扩展我的 comment :

  1. 您有一个名为 ActiveFlagobservable 绑定(bind)到 bootstrapSwitchOn 绑定(bind),当 bootstrap 开关 被更新时切换。
  2. 并且 Knockoutjs 具有允许您注册对 observables 更改的回调。

考虑到这些要点,如果您有一个 observable 绑定(bind)到您的切换更改,并且您想在该切换更改时调用一些函数,那么您可以将您的函数注册为监听 observable 变化的回调。

希望这个片段可以解释这个逻辑:

/**
 * Knockout binding handler for bootstrapSwitch indicating the status
 * of the switch (on/off): https://github.com/nostalgiaz/bootstrap-switch
 */
ko.bindingHandlers.bootstrapSwitchOn = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
    $elem = $(element);
    $(element).bootstrapSwitch();
    $(element).bootstrapSwitch('setState', ko.utils.unwrapObservable(valueAccessor())); // Set intial state
    $elem.on('switch-change', function(e, data) {
      valueAccessor()(data.value);
    }); // Update the model when changed.
  },
  update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
    var vStatus = $(element).bootstrapSwitch('state');
    var vmStatus = ko.utils.unwrapObservable(valueAccessor());
    if (vStatus != vmStatus) {
      $(element).bootstrapSwitch('setState', vmStatus);
    }
  }
};

// your viewmodel bound to the web page

var vm = function() {
  this.log = ko.observableArray([]);

  // ActiveFlag observable bound to switch, synced with state of switch
  this.ActiveFlag = ko.observable(false);

  // the function I want to call whenever the switch state changes
  var doSomethingWhenSwitchStateChanges = function(value) {
    this.log.push('the switch state changed to: ' + value);
  }.bind(this);

  // register callback
  var subscription = this.ActiveFlag.subscribe(doSomethingWhenSwitchStateChanges);

}

ko.applyBindings(new vm());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-switch/2.0.0/css/bootstrap-switch.min.css" rel="stylesheet" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-switch/2.0.0/js/bootstrap-switch.min.js"></script>


<div class="row">
  <div class="col-md-6">
    <div>
      <input type="checkbox" data-bind="checked: ActiveFlag" />
    </div>
    <div>
      <input type="checkbox" data-bind="bootstrapSwitchOn: ActiveFlag" />
    </div>
  </div>
  <div class="col-md-6" data-bind="foreach: log">
    <p data-bind="text: $data"><p>
  </div>
</div>

关于javascript - 如何在knockout js中为checkbox绑定(bind)change事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499813/

相关文章:

javascript - 没有 NodeJS 的 Typescript 命令行编译

javascript - 为什么在对象的函数属性中声明变量之前可以引用它?

knockout.js - Typescript 在内部模块中导入外部模块

javascript - 如何在不给他们 id 的情况下获取 li 的文本?

javascript - 使用持久存储创建 HTML5 离线应用程序

php - 从数据库中检索散列的 PHP 密码并检查 Javascript 中提交的密码

javascript - 在 knockout 阵列中搜索重复条目

javascript - 具有 knockout 绑定(bind)的静态标签不会在页面加载时显示

javascript - 如何访问同一 viewModel 中不同分支的后代?

knockout.js - $parent 绑定(bind)不能像我想的那样工作,为什么?