2014-04-22 71 views
0

我有一個如下所示的模板綁定的視圖模型,它正確顯示所有內容。 但我喜歡做的是如果當前行文件夾與前一行的文件夾相同,那麼我想把空白而不是重複相同的文件夾。我試過在這樣的數據綁定:「text:($ index()> 0?($ data [$ index() - 1] .Folder == $ data.Folder?'':$ data。 。文件夾):「」) ,但它不工作,任何幫助將不勝感激謝謝knockoutjs將當前行元素與前一行元素進行比較

<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> 
+0

是的,內容被宣佈爲obserableArray獲得前一個元素。 –

回答

1

你的語法來訪問在foreach塊內的內容陣列不正確:

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

$ data是當前內容()可觀察數組元素,而不是內容數組本身。要訪問的內容陣列可以使用:

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

,如果$指數()> 0

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

在視圖模型創建一個函數來做到的決心可見或不可見 - 它可以更容易進行測試。和你的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

+0

假設內容是一個可觀察數組,上面的代碼應該有()附加到每個內容的出現。例如。 「return this.contents()[index - 1] .Folder!= this.contents()[index] .Folder;」 –

+0

@ChuckSchneider,正確,*如果*'contents'是一個可觀察數組。在我的例子中,爲了簡單起見,我只使用了一個常規數組(並且原始問題並未指出是否使用了可觀察數組)。 – PatrickSteele

相關問題