从淘汰赛foreach循环中访问先前索引的项目?

时间:2013-12-15 23:25:02

标签: knockout.js

我有一个列出邮件的聊天应用程序 - 如果当前邮件和上一条邮件是由同一用户发布的,我不希望在当前邮件中显示用户名。

要开始使用它,我试图导出foreach以通过相对索引访问数组。好像我甚至无法通过直接索引访问项目:

<ul data-bind="foreach:array1">
    <li data-bind="text:$parent.array1()[0]">Should be John, works</li>
    <li data-bind="text:$parent.array1()[$index]">Should be the same as $data, but throws error</li>
</ul>

最后,我想做以下事情:

<ul data-bind="foreach:array1">
    <li data-bind="text:$parent.array1()[$index - 1]">Happens after index 0 only</li>
</ul>

小提示演示第一个问题:http://jsfiddle.net/xveEP/148/

如何实现这一目标?

3 个答案:

答案 0 :(得分:5)

如果您检查Knockout更改日志,$index已在版本2.1.0中实现:http://blog.stevensanderson.com/2012/05/09/knockout-2-1-0-released/因此更改jsfiddle版本解决了部分问题1。你不会再看到错误了。

现在您必须正确绑定$index。根据文档,它是一个可观察的,所以要在表达式中使用它,你需要返回它的值:data-bind="text:$parent.array1()[$index()]"。敲除文本绑定文档注1:http://knockoutjs.com/documentation/text-binding.html

这让我们工作jsfiddle:http://jsfiddle.net/xveEP/150/

当您将相同的解决方案(更改版本并在表达式中使用$index())添加到第二个问题时,您可以执行所需的操作:http://jsfiddle.net/xveEP/151/

答案 1 :(得分:0)

我认为这是你想要的第一个问题。而不是$index,请使用ko.utils.arrayIndexOf($parent.array1, $data)。更新的小提琴在这里http://jsfiddle.net/rwisch45/xveEP/149/

答案 2 :(得分:0)

由于这实际上没有解决,所以这是一个有效的解决方案:

您可以使用$ index() - 1指向上一个项目,然后执行您需要的任何逻辑。引用array1 [$ index() - 1] .property会在第一个项目上引发错误,因为array1 [-1]不存在,所以你必须有条件地执行它,如:

:empty

完整示例:http://jsfiddle.net/DougLeary/p6xhd3uk/