If you don't want to use {{each}}, because you don't want your entire template to re-render constantly, then you could put an "index" property on your individual items. Rather than make it a dependentObservable on each item where re-evaluating would require looping through the array and finding your own index, I would probably do a manual subscription on the observableArray and make one loop through the items and update the "index" property. Might look like this:
//attach index to items whenever array changes
viewModel.tasks.subscribe(function() {
var tasks = this.tasks();
for (var i = 0, j = tasks.length; i < j; i++) {
var task = tasks[i];
if (!task.index) {
task.index = ko.observable(i);
} else {
task.index(i);
}
}
}, viewModel);
You could obviously call the observable whatever you want, if index might cause a conflict. The nice part about this is that you don't really have to mess with your item definition at all, as this index is just managed completely from this subscription. You would want to set up this subscription prior to adding any items to your array. Sample here:
http://jsfiddle.net/rniemeyer/CXBFN/