我无法回复所选答案,但我有一个增强版的代码,支持每个输入值的多个唯一ID。 它在我的博客上 http://drewp.quickwitretort.com/2012/09/18/0 上,这里也重复一遍:
ko.bindingHandlers.uniqueId = {
counter: 0,
_ensureId: function (value, element) {
if (value.id === undefined) {
value.id = "elem" + (++ko.bindingHandlers.uniqueId.counter);
}
var id = value.id, which = element.getAttribute("data-which");
if (which) {
id += "-" + which;
}
return id;
},
init: function(element, valueAccessor) {
var value = valueAccessor();
element.id = ko.bindingHandlers.uniqueId._ensureId(value, element);
},
};
ko.bindingHandlers.uniqueFor = {
init: function(element, valueAccessor) {
element.setAttribute(
"for", ko.bindingHandlers.uniqueId._ensureId(valueAccessor(), element));
}
};
现在您可以为一个记录拥有多个带有自动ID的标记复选框:
<li data-bind="foreach: channel">
<input type="checkbox" data-which="mute" data-bind="uniqueId: $data, checked: mute">
<label data-which="mute" data-bind="uniqueFor: $data">Mute</label>
<input type="checkbox" data-which="solo" data-bind="uniqueId: $data, checked: solo">
<label data-which="solo" data-bind="uniqueFor: $data">Solo</label>
</li>
$index
不存在,但如果您不需要id
始终是唯一的(如果您删除最后一个项目并添加一个新项目,则它们将具有相同的id
),则可以使用它。此外,在您的绑定中,如果您在表达式中使用$index
,则需要将其作为函数调用,例如:'status_' + $index()
。 - RP Niemeyerelement.setAttribute("for", value.id);
的替代方法是element.htmlFor = value.id;
。 - Tomalak