在Knockout Foreach循环中生成ID

Arb*_*ter 8 javascript jquery-ui mvvm knockout.js

我正在尝试使用Knockout构建一些HTML,Jquery UI可以转换为切换按钮.我需要得到的是:

<div id="status">
    <input type="radio" id="status_ACTIVE" value="ACTIVE" name="status" /><label for="status_ACTIVE">Active</label>
    <input type="radio" id="status_INACTIVE" value="INACTIVE" name="status" checked="checked" /><label for="status_INACTIVE">Inactive</label>
</div>
Run Code Online (Sandbox Code Playgroud)

使用JQuery UI我可以轻松地将其转换为切换按钮.但是,如何在不使用现已折旧的JQuery模板的情况下生成它?这就是我试图做的事情:

在javascript模型中:

self.statuses = [{Selected:true,Text:"Active",Value:"ACTIVE"},{Selected:false,Text:"Inactive",Value:"INACTIVE"}];
Run Code Online (Sandbox Code Playgroud)

标记:

<div id="status" data-bind="foreach: statuses">
    <input type="radio" name="status" data-bind="value: Value, id: 'status_' + Value" /><label data-bind="text: Text, for: 'status_' + Value"></label>
</div>
Run Code Online (Sandbox Code Playgroud)

这不起作用.我不认为它喜欢我如何创建该ID,或将其与循环中的for关联.它不正确地绘制按钮,因为两个独立的按钮和点击功能不起作用.

即使我只是将值指定为id id: Value,for: Value它仍然不起作用.我可以不使用knockout设置这些属性吗?

Arb*_*ter 10

添加此JavaScript解决了我的问题:

ko.bindingHandlers.id = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).attr('id', valueAccessor());
    }
};

ko.bindingHandlers.forattr = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).attr('for', valueAccessor());
    }
};
Run Code Online (Sandbox Code Playgroud)

我也必须改变for: 'status_' + Valueforatt: 'status_' + Valuefor是一个保留字.

更新: 我也可以使用"attr"绑定,如下所示:

attr: { for: 'status_' + Value }
Run Code Online (Sandbox Code Playgroud)

  • 您在'**update**'中添加的解决方案是解决此问题的正确方法.添加额外的绑定处理程序似乎不值得麻烦imo. (3认同)
  • 对于唯一ID,您还可以使用data-bind ="attr:{for:'status_'+ $ index}"和data-bind ="attr:{id:'status_'+ $ index}".$ index to指当前数组项的从零开始的索引.$ index是一个可观察的,只要项目的索引发生变化(例如,如果项目被添加到数组中或从数组中删除),就会更新. (2认同)