Knockout.js 访问以前的索引';从淘汰foreach循环中删除项目?

Knockout.js 访问以前的索引';从淘汰foreach循环中删除项目?,knockout.js,Knockout.js,我有一个聊天应用程序,列出消息-如果当前消息和以前的消息是由同一个用户发布的,我不想在当前消息上显示用户名 首先,我尝试导航出foreach以通过相对索引访问数组。似乎我甚至无法通过直接索引访问项目: <ul data-bind="foreach:array1"> <li data-bind="text:$parent.array1()[0]">Should be John, works</li> <li data-bind="text:

我有一个聊天应用程序,列出消息-如果当前消息和以前的消息是由同一个用户发布的,我不想在当前消息上显示用户名

首先,我尝试导航出
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>
  • 仅在索引0之后发生
Fiddle演示第一个问题:


如何才能做到这一点?

我想这就是你想要解决的第一个问题。使用
ko.utils.arrayIndexOf($parent.array1,$data)代替
$index
。更新的fiddle就在这里

如果您检查了Knockout changelog,
$index
是在版本2.1.0中实现的:因此在JSFIDLE中更改版本可以部分解决问题1。您将不再看到错误

现在您必须正确绑定
$index
。根据文档,它是可观察的,所以要在表达式中使用它,需要返回它的值:
data bind=“text:$parent.array1()[$index()]”
。剔除文本绑定文档注释1:

这给我们提供了一个工作界面:


当您将相同的解决方案(更改版本并在表达式中使用
$index()
)应用于第二个问题时,您可以做您想做的事情:

由于这一问题实际上没有得到解决,下面是一个有效的解决方案:

可以使用$index()-1指向上一项,然后对其执行所需的任何逻辑。引用array1[$index()-1]。属性将在第一项上引发错误,因为array1[-1]不存在,因此必须有条件地执行此操作,如中所示:

data-bind="text: (array1[$index()-1]) ? array1[$index()-1].property : ''"

完整示例:

谢谢。如果可能的话,我不希望遍历每个项目的整个数组。。。如果我没有弄错的话,这个解决方案将渲染推到n^2。完美。非常感谢:)最后一把小提琴似乎不起作用。我将
array 1 John Joe
视为输出,这正是您应该看到的。对于每个数组元素,将打印上一个。数组1[0-1]未定义,因此只有两个可见。检查并修改索引: