Knockout.js唯一ID,用于单选按钮组中的"for"标签属性

Tom*_*all 3 html javascript dom knockout.js

我已经实现了非常狡猾的回答的一个变种在这里生成的唯一ID,用于输入和我的淘汰赛标记相应的标签.我的最终目标是可点击的标签,而不是唯一的ID本身 - 我以前在每个标签上使用点击绑定,导航DOM以选择其输入,但这似乎是破碎和低效的.

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

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

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

Kye*_*ica 7

从我的评论中,使用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]);
    } 
};
Run Code Online (Sandbox Code Playgroud)

使用示例:

<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>
Run Code Online (Sandbox Code Playgroud)