Knockout.js 跳过敲除可观察数组中的$index()

Knockout.js 跳过敲除可观察数组中的$index(),knockout.js,Knockout.js,我有一个表,它显示了一个敲除可观察数组中的一些信息,我使用文本的数据绑定:$index()+1来显示每个项目在数组中的位置。现在,我希望能够跳过项目的位置,如果项目的值为true,则将其设为空。因此,最终结果将是显示正常的1到x索引,但对于每个将某个值设置为true的项目,将不显示任何索引,并且索引计数将在该项目之后拾取,就好像该项目根本不包括在索引计数中一样 我已经做了一个例子来说明这个问题 有没有什么好办法 只需在td数据绑定中使用条件运算符,并显示或空字符串或索引: <table d

我有一个表,它显示了一个敲除
可观察数组中的一些信息,我使用
文本的数据绑定:$index()+1
来显示每个项目在数组中的位置。现在,我希望能够跳过项目的位置,如果项目的值为
true
,则将其设为空。因此,最终结果将是显示正常的1到
x
索引,但对于每个将某个值设置为
true
的项目,将不显示任何索引,并且索引计数将在该项目之后拾取,就好像该项目根本不包括在索引计数中一样

我已经做了一个例子来说明这个问题


有没有什么好办法

只需在
td
数据绑定中使用条件运算符,并显示或空字符串或索引:

<table data-bind="foreach: people">
    <tr>
        <td data-bind="text: isresting ? '' : $index() + 1"></td>
        <td data-bind="text: name"></td>  
        <td data-bind="text: isresting"></td>
    </tr>   
</table>

更新

我已更新了我的实现,并添加了一个函数,用于更正计算索引:

Html:


视图模型:

function ViewModel() {
    var self = this;
    self.people = ko.observableArray();
    self.getIndexForMan = function(man) {
        if (man.isresting) {
            return null;
        }        
        var index = 1;
        var rawPeople = self.people();
        for (var i = 0; i < rawPeople.length; i++) {
            if (rawPeople[i] == man) {
                break;
            }
            if (!rawPeople[i].isresting) {
                index++;
            }
        }
        return index;
    }
};

var model = new ViewModel();
model.people(data);
ko.applyBindings(model);
函数ViewModel(){
var self=这个;
self.people=ko.observearray();
self.getIndexForMan=函数(man){
如果(人正在测试){
返回null;
}        
var指数=1;
var rawPeople=self.people();
for(var i=0;i

下面是一个使用子视图模型的示例,我在其中切换索引的可见性


var ViewModel=函数(数据){
var _self=这个;
var personCount=0;
_self.PeopleMap=ko.array(
ko.utils.arrayMap(数据、函数(项){
如果(!item.isresting){
personCount++;
}
返回新的PeopleViewModel(item,personCount);
}));
};
var PeopleViewModel=函数(数据,个人帐户){
var _self=这个;
_self.Name=ko.observable(data.Name);
_self.IsResting=ko.可观察(data.IsResting);
_self.PersonIndex=ko.可观察(personCount);
};
应用绑定(新视图模型(数据));
function ViewModel() {
    var self = this;
    self.people = ko.observableArray();
    self.getIndexForMan = function(man) {
        if (man.isresting) {
            return null;
        }        
        var index = 1;
        var rawPeople = self.people();
        for (var i = 0; i < rawPeople.length; i++) {
            if (rawPeople[i] == man) {
                break;
            }
            if (!rawPeople[i].isresting) {
                index++;
            }
        }
        return index;
    }
};

var model = new ViewModel();
model.people(data);
ko.applyBindings(model);
<table data-bind="foreach: PeopleMap">
    <tr>
        <td>
            <span data-bind="text: PersonIndex, visible: !IsResting()"></span>
        </td>
        <td data-bind="text: Name"></td>
        <td data-bind="text: IsResting"></td>
    </tr>
</table>


var ViewModel = function (theData) {
    var _self = this;
    var personCount = 0;
    _self.PeopleMap = ko.observableArray(
    ko.utils.arrayMap(theData, function (item) {
        if(!item.isresting){
            personCount++;
        }
        return new PeopleViewModel(item, personCount);
    }));
};

var PeopleViewModel = function (data, personCount) {
    var _self = this;
    _self.Name = ko.observable(data.name);
    _self.IsResting = ko.observable(data.isresting);
    _self.PersonIndex = ko.observable(personCount);
};
ko.applyBindings(new ViewModel(data));