我有一个列出邮件的聊天应用程序 - 如果当前邮件和上一条邮件是由同一用户发布的,我不希望在当前邮件中显示用户名。
要开始使用它,我试图导出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/
如何实现这一目标?
答案 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