How to access the index of an item in knockout.js template

拟墨画扇 提交于 2019-12-20 11:53:22

问题


Within my template in tbody below, how can I access the index of the item being rendered?

<table>
        <tbody data-bind="foreach:contacts">
            <tr class="contactRow" valign="top">
            <td><a href="#" data-bind="click: function(){viewModel.removeContact($data)}">Delete</td>
            <td><input data-bind="value: FirstName" name="Contacts[].FirstName"/></td>
            <td><input data-bind="value: LastName" name= "Contacts[].LastName"  /></td>
            <td><input data-bind="value: Username"  name="Contacts[].Username"/></td>
            <td><input data-bind="value: Email"   name="Contacts[].Email"/></td>
        </tr>
        </tbody>
        <thead>
            <tr>
                <th>Controls</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Username</th>
                <th>Email</th>
            </tr>
        </thead>
    </table>

回答1:


Update: $index is now available in KO 2.1.

Currently, there is not a way to directly access the index in a foreach. There is a pull request that looks at adding a $index variable here: https://github.com/SteveSanderson/knockout/pull/182

An option that I have used in the past is to use a manual subscription against an observableArray that keeps an index observable in sync.

It works like:

//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);

Here is a sample: http://jsfiddle.net/rniemeyer/CXBFN/




回答2:


I'm doing this and it's working pretty well. Not the best looking, but keeps everything in order:

Use the attr: binding to set the name attribute of your field and then use $parent.CallForwards.indexOf($data) to get your index.

data-bind="value: Name, attr: {name: 'CallForwards[' + $parent.CallForwards.indexOf($data) + '].Name'}"



回答3:


I believe it gets easier with KO 2.1: you can use $index in the foreach loop to refer to the current index.

https://github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js

documentation: http://knockoutjs.com/documentation/binding-context.html



来源:https://stackoverflow.com/questions/8744374/how-to-access-the-index-of-an-item-in-knockout-js-template

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!