【问题标题】:Checked radio within label doesn't trigger event标签内选中的收音机不会触发事件
【发布时间】:2018-04-13 23:36:08
【问题描述】:

我试图从单选按钮列表中获取选中的值,为此我试图将选中的值加载到 observable 中。从文档来看,这是建议的方式:

<input type="radio" name="type"  data-bind="value:ct.value, checked: $root.selectedtype" required>

但是,这在我的情况下不起作用。我的收音机周围有一个标签,如果我在标签上添加点击事件,它会填充可观察的 selectedtype 正确,这样我可以获得所选值,例如:

 <label class="btn btn-outline-dark" data-bind="click:$root.selectedtype">

如果单选按钮被选中,为什么 'checked' 事件不会触发所需的操作?

 <label for="email">Company Type</label>
                    <div data-toggle="buttons" class="form-group label-block">
                        <div class="row">
                            <div class="col-sm-6" data-bind="foreach: { data: companytype, as: 'ct' }">
//-->   this way it works       <label class="btn btn-outline-dark" data-bind="click:$root.selectedtype"> 
                                    <input type="radio" name="type"  data-bind="value:ct.value" required>
//-->   this way it does not work          <input type="radio" name="type"  data-bind="value:ct.value, checked: $root.selectedtype" required>
                                    <span data-bind="text: ct.label"></span>
                                </label>
                            </div>
                        </div>
                        <div class="help-block with-errors"></div>
                    </div>

 Selected: <span data-bind="text: selectedtype().value"></span>-

在我的模型中:

   var companytype = ko.observableArray([]);
   var selectedtype = ko.observable('');

   var init = function () {
        getItemList();
        companytype.push({ "label": "LTD", "value": "1" });
        companytype.push({ "label": "PLC", "value": "2" });        
        companytype.push({ "label": "LLP", "value": "3" });
        companytype.push({ "label": "Sole Trader", "value": "4" });
    }

【问题讨论】:

  • 输入元素末尾的“必需”文本是什么?
  • @Arnab 必须检查一个选项才能提交表单

标签: knockout.js knockout-3.0


【解决方案1】:

var companytype = ko.observableArray([]);
var selectedtype = ko.observable('');

var init = function() {
  //getItemList();
  companytype([
    { "label": "LTD", "value": "1" },
    { "label": "PLC", "value": "2" },
    { "label": "LLP", "value": "3" },
    { "label": "Sole Trader", "value": "4" }
  ]);
}

init();
var viewModel = { companytype, selectedtype };

ko.applyBindings(viewModel);
.btn {
  border: 1px solid black;
  padding: 2px 4px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<label for="email">Company Type</label>
<div data-toggle="buttons" class="form-group label-block">
  <div class="row">
    <div class="col-sm-6" data-bind="foreach: { data: companytype, as: 'ct' }">
      <label class="btn btn-outline-dark" data-bind="click: function(){	$root.selectedtype($data); return true; }"> 
          <input type="radio" name="type"  data-bind="checked: $root.selectedType" required>
          <span data-bind="text: ct.label"></span>
      </label>
    </div>
  </div>
  <div class="help-block with-errors"></div>
</div>

Selected: <span data-bind="text: ko.toJSON(selectedtype)"></span>

您可以使用选中的绑定,但是因为标签和单选按钮控件都在尝试处理单击事件,所以它们相互争斗。您需要让标签的点击函数返回“true”,以便事件不会继续向下传递到单选控件。

<label class="btn btn-outline-dark" data-bind="click: function(){ $root.selectedtype($data); return true; }"> 
    <input type="radio" name="type" data-bind="checked: $root.selectedType" required>
    <span data-bind="text: ct.label"></span>
</label>

【讨论】:

  • 聪明的杰森 -------------
【解决方案2】:

这是你想要的吗?两个单选按钮都有效:

var VM = function(){
    var self=this;
    self.companytype = ko.observableArray([]);
    self.selectedtype = ko.observable("");

    self.init = function () {
            //getItemList();
            self.companytype.push({ "label": "LTD", "value": "1" });
            self.companytype.push({ "label": "PLC", "value": "2" });        
            self.companytype.push({ "label": "LLP", "value": "3" });
            self.companytype.push({ "label": "Sole Trader", "value": "4" });
    }
}
var vm = new VM();
vm.init();
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<label for="email">Company Type</label>
      <div data-toggle="buttons" class="form-group label-block">
        <div class="row">
         <div class="col-sm-6" data-bind="foreach: { data: companytype, as: 'ct' }">
            <input type="radio" name="type"  data-bind="value:ct.value, checked: $root.selectedtype" required> 
            <span data-bind="text: ct.label"></span>         
         </div>
        </div>
       <div class="help-block with-errors"></div>
      </div>

 Selected: <span data-bind="text: selectedtype()"></span>

【讨论】:

  • 它不起作用。如果您删除
  • 删除了标签。选择:数据绑定不正确。
  • 标签必须存在
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 2019-03-03
  • 2023-04-03
  • 2021-06-26
  • 1970-01-01
  • 2012-12-14
  • 2023-02-05
相关资源
最近更新 更多