【问题标题】:Knockout.js unique IDs for use in "for" label attribute in radio button groups用于单选按钮组中“for”标签属性的 Knockout.js 唯一 ID
【发布时间】:2012-07-17 00:54:37
【问题描述】:

我已经实现了一个非常巧妙的答案here 的变体,用于为我的 Knockout 标记中的输入和相应标签生成唯一 ID。我的最终目标是可点击的标签,而不是唯一的 ID 本身——我之前一直在每个标签上使用点击绑定来导航 DOM 以选择其输入,但这似乎很糟糕且效率低下。

但是,链接的解决方案不适用于单选按钮组,其中组中的每个单选都绑定回同一个可观察对象。在我的情况下,我的无线电组要么是真/假(绑定回布尔可观察对象),要么代表一个枚举,在这种情况下,可观察对象包含一个整数值。所提供的解决方案会导致组中的所有无线电(及其相应的属性标签)获得相同的 ID。

为了使事情变得更复杂,这些单选按钮集本身会出现多次。例如,可能有 10 个模板 div,每个 div 有一组 3 个单选按钮:红色、绿色、蓝色 - 每个单选都有一个标签,我想在点击时激活相应的单选。

我一直在努力修改这个解决方案以适应它,但我的大脑现在已经被锁定了。欢迎任何想法!

【问题讨论】:

  • 我的临时解决方案是通过将无线电输入 inside 标签仅依靠隐式关联 - 但我不喜欢这种方法,因为该站点将被调整由可能会改变结构的平面设计师(是的,我也很害怕),由于 CSS 样式问题,我不喜欢使用标签。
  • 你能用你的视图模型的例子发一个小提琴吗?目前尚不清楚您是如何重复使用无线电的。
  • 是的,这是一个简化的示例:jsfiddle.net/qeQTd/17 Cheers。
  • 我现在在想,我可以用与名称类似的方式生成带有绑定的 ID,然后在标签上重复使用它 - 但标记会变得非常令人发指。跨度>
  • 对我来说很好用:jsfiddle.net/tyrsius/52xDw/1。此外,映射插件实际上使您的示例比仅使用 arrayMap 时的示例更长更复杂。

标签: javascript html dom knockout.js


【解决方案1】:

根据我的评论,a fiddle 使用 RP 的绑定和修改

ko.bindingHandlers.uniqueId = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();
        var idMod = 'id-' + (allBindingsAccessor().uniqueMod || 0);
        value[idMod] = value[idMod] || ko.bindingHandlers.uniqueId.prefix + (++ko.bindingHandlers.uniqueId.counter);

        element.id= value[idMod];
    },
    counter: 0,
    prefix: "unique"
};

ko.bindingHandlers.uniqueFor = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();
        var idMod = 'id-' + (allBindingsAccessor().uniqueMod || 0);
        value[idMod] = value[idMod] || ko.bindingHandlers.uniqueId.prefix + (++ko.bindingHandlers.uniqueId.counter);

        element.setAttribute("for", value[idMod]);
    } 
};

使用示例:

<input type="radio" data-bind="checked: gender, attr: { name: 'gender-' + id() },
     uniqueId: gender, uniqueMod: 'male'" value="1" />
<label data-bind="uniqueFor: gender, uniqueMod: 'male' ">Male</label>

<input type="radio" data-bind="checked: gender, attr: { name: 'gender-' + id() },
    uniqueId: gender, uniqueMod: 'female'" value="2" />
<label data-bind="uniqueFor: gender, uniqueMod: 'female '">Female</label>

【讨论】:

  • @RPNiemeyer 谢谢。获得专家的称赞总是开始新一天的好方法 =)
  • @RPNiemeyer 这仍然是最好的方法吗?
  • @JohnZabroski - 我认为它仍然是一个不错的选择
猜你喜欢
  • 2019-03-29
  • 2013-04-11
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多