プロパティをインデックスに設定するカスタム バインディングを作成できます。次のようになります。
ko.bindingHandlers.setIndex = {
init: function(element, valueAccessor, allBindings, data, context) {
var prop = valueAccessor();
data[prop] = context.$index;
}
};
これは、配列内のオブジェクトを扱っていることを前提としています。次のように使用します。
<ul data-bind="foreach: items">
<li data-bind="setIndex: 'myIndex', text: name"></li>
</ul>
したがって、これにより$index
、指定したプロパティ名でオブザーバブルがオブジェクトにコピーされます。サンプル: http://jsfiddle.net/rniemeyer/zGmcg/
バインディングの外でこれを行う別の方法 (これは私が以前に行っていた方法です$index
) は、observableArray への変更をサブスクライブし、毎回インデックスを再作成することです。
observableArray の拡張は次のようになります。
//track an index on items in an observableArray
ko.observableArray.fn.indexed = function(prop) {
prop = prop || 'index';
//whenever the array changes, make one loop to update the index on each
this.subscribe(function(newValue) {
if (newValue) {
var item;
for (var i = 0, j = newValue.length; i < j; i++) {
item = newValue[i];
if (!ko.isObservable(item[prop])) {
item[prop] = ko.observable();
}
item[prop](i);
}
}
});
//initialize the index
this.valueHasMutated();
return this;
};
次に、次のように使用します。
this.myItems = ko.observableArray().indexed('myIndexProp');
サンプルは次のとおりです: http://jsfiddle.net/rniemeyer/bQD2C/