knockoutjs将当前行元素与前一行元素进行比较

时间:2014-04-22 00:35:51

标签: knockout.js

我有一个敲除视图模型绑定到模板,如下所示,它正确显示所有内容。 但我喜欢做的是,如果当前行文件夹与上一行的文件夹相同,那么我想把空白而不是重复相同的文件夹。 我试过像这样的数据绑定:“text:($ index()> 0?($ data [$ index() - 1] .Folder == $ data.Folder?'':$ data。文件夹):'') 但它不起作用。任何帮助将不胜感激。感谢。

<table border="1">    
    <script type="text/html" id="content-template">  

        <tr data-bind="css: { 'firstRow': $index() % 2 }">
            <td><span data-bind="text: $index() + 1"></span></td>
            <td><span data-bind="text: Folder"></span></td>
            <td><span data-bind="text: Location"></span></td>                    
        </tr>
    </script>
</table>
<div data-bind="visible: loaded()">        
    <div id="data" data-bind="template: { name: 'content-template', foreach: contents }"></div> 
</div>

2 个答案:

答案 0 :(得分:2)

在viewmodel上创建一个函数来确定是否可见 - 它使测试更容易,data-bind属性更简单:

showItem: function(index) {
    if( index == 0 )
        return true;

    return this.contents[index - 1].Folder != this.contents[index].Folder;
}

现在将visible属性绑定到此函数:

visible: $parent.showItem($index())

这是jsFiddle showing a working example

答案 1 :(得分:1)

访问foreach块中的contents数组的语法不正确:

"text: ($index() > 0 ? ($data[$index() - 1].Folder == $data.Folder ? '': $data.Folder) : '')

$ data是当前内容()可观察数组元素,而不是内容数组本身。要访问内容数组,您可以使用:

$parent.contents()[$index()]

并获取前一个元素,如果$ index()&gt; 0

$parent.contents()[$index()-1]