【问题标题】:Labelling Checkbox and Radio in knockout在淘汰赛中标记复选框和收音机
【发布时间】:2023-03-13 15:02:01
【问题描述】:

在 html 中,当我们点击文本或将鼠标悬停在单选按钮或复选框的文本上时,我们可以使用 html 选择它,如下所示:

<label>
<input type="checkbox" />option 1
</label>

<input id="checkboxid" type="checkbox" />
<label for="checkboxid">option 1</label>

我正在尝试通过淘汰赛获得相同的行为,但无法找到太多帮助:

<label data-bind="text: $data.optiontext">
    <input type="checkbox" data-bind="value: $data.optionvalue, checked: $parent.selectedOptions" />
</label>

View(或html)在下面(注意下面的代码不包含上面的html,所以当你尝试它时,你需要进行上面的更改并检查它):

<div data-bind="foreach: options">
    <input type="checkbox" data-bind="value: $data.optionvalue, checked: $parent.selectedOptions" />
    <label data-bind="text: $data.optiontext"></label>
</div>

<hr />

<div data-bind="text: selectedOptionsList"></div>​

这是视图模型:

var viewModel = {
    options: [
                { optiontext: 'Simple', optionvalue: "1" },
                { optiontext: 'Advanced', optionvalue: "2" }
             ],
    selectedOptions: ko.observableArray(["2"])
};

viewModel.selectedOptionsList = ko.computed(function() {
    return this.selectedOptions().join(",");
}, viewModel);

ko.applyBindings(viewModel);

这里是 jsFiddle 链接:http://jsfiddle.net/rupesh_kokal/AFzbY/

【问题讨论】:

    标签: javascript html knockout.js


    【解决方案1】:

    你甚至可以通过使用 Knockouts 注释绑定语法来获得绑定以删除额外的跨度元素:

    <label>
    <input type="checkbox" data-bind="value: $data.optionvalue, 
           checked: $parent.selectedOptions" />
    <!-- ko text: $data.optiontext --><!-- /ko --></label>
    

    如果在狭窄的空间中使用,这将防止复选框和跨度分成两行。

    【讨论】:

      【解决方案2】:

      您可以通过为文本使用额外的span 来实现 1. 版本:

      <label>
          <input type="checkbox" data-bind="value: $data.optionvalue, 
                 checked: $parent.selectedOptions" />
          <span data-bind="text: $data.optiontext"/>
      </label>
      

      Demo fiddle.

      或者使用attr binding设置idfor属性的2.版本:

      <input type="checkbox" data-bind="value: $data.optionvalue, 
             checked: $parent.selectedOptions, attr: { id: optiontext}" />    
      <label data-bind="text: $data.optiontext, attr: {for: optiontext}" />
      

      Demo fiddle

      【讨论】:

      • 感谢 nemesv。第一个选项最适合我的任务。第二个版本在我的情况下不起作用,因为我有各种复选框控件,它们是动态创建的,并且需要有一些动态的方式来为其分配唯一的 id。有什么方法可以通过淘汰赛来实现这一点,比如创建一个由淘汰赛内部负责分配的唯一 id?
      • Knout 中没有内置任何东西来处理生成和分配唯一 ID。所以你需要自己实现这个:关于id创建的一些SO问题stackoverflow.com/questions/3231459/…stackoverflow.com/questions/105034/…
      • 感谢 nemesv,会调查的。
      • lodash 和下划线带有 _.uniqueId,可用于 id 属性。
      • 第一个选项给我带来了问题......由于某种原因它破坏了 IE8。我可能会尝试使用唯一 ID 的第二个选项,但它看起来不值得花时间。
      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2020-08-28
      • 2014-02-22
      • 2013-03-11
      • 2013-08-06
      相关资源
      最近更新 更多