2013-12-15 98 views
2

我有一個列出消息的聊天應用程序 - 如果當前消息和以前的消息由同一用戶發佈,我不想在當前消息上顯示用戶名。從knockout foreach循環中訪問以前的索引項目?

要開始使用此,我想瀏覽了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/

這是如何實現的?

回答

5

如果檢查淘汰賽更改日誌$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/

+0

完美。非常感謝:) – RobVious

+0

最後一個小提琴似乎不工作。我看到陣列1 約翰 Joe'作爲輸出 –

+0

這正是你應該看到的。對於每個數組元素,前一個被打印。 array1 [0-1]未定義,因此只有兩個可見。用索引檢查小提琴:http://jsfiddle.net/xveEP/203/ –

0

我認爲這是你想要的第一個問題。而不是$index,請使用ko.utils.arrayIndexOf($parent.array1, $data)。更新小提琴是這裏http://jsfiddle.net/rwisch45/xveEP/149/

+0

謝謝。如果可能的話,我不希望遍歷整個數組的每個項目...如果我沒有弄錯,這個解決方案將渲染推到n^2。 – RobVious

0

由於這實際上並沒有解決,這裏是一個可行的解決方案:

您可以使用$指數() - 1點到前一個項目,然後執行你需要它的任何邏輯。引用數組1 [$指數() - 1] .property會拋出一個錯誤的第一個項目,因爲數組1 [-1]不存在,所以你必須有條件做到這一點,如:

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

完整的例子: http://jsfiddle.net/DougLeary/p6xhd3uk/