Я делал что-то подобное в прошлом:
ko.bindingHandlers.uniqueId = {
init: function(element) {
element.id = ko.bindingHandlers.uniqueId.prefix + (++ko.bindingHandlers.uniqueId.counter);
},
counter: 0,
prefix: "unique"
};
ko.bindingHandlers.uniqueFor = {
init: function(element, valueAccessor) {
var after = ko.bindingHandlers.uniqueId.counter + (ko.utils.unwrapObservable(valueAccessor()) === "after" ? 0 : 1);
element.setAttribute("for", ko.bindingHandlers.uniqueId.prefix + after);
}
};
Вы могли бы использовать их как:
<ul data-bind="foreach: items">
<li>
<label data-bind="uniqueFor: 'before'">Before</label>
<input data-bind="uniqueId: true, value: name" />
<label data-bind="uniqueFor: 'after'">After</label>
</li>
</ul>
Таким образом, он просто сохраняет состояние самой привязки, увеличивая ko.bindingHandlers.uniqueId.counter
.Затем привязка uniqueFor
должна знать, находится ли она до или после поля, чтобы узнать, как получить правильный идентификатор.
Пример здесь: http://jsfiddle.net/rniemeyer/8KJD3/
Если ваши метки не были рядом с их полями (несколько входов ограничены перед каждой меткой, возможно, в отдельных строках таблицы), то вам нужно будет взглянуть надругая стратегия.