2013-03-07 14 views
9

Mam tabelę z nagłówkami (#, nazwa użytkownika, nazwisko użytkownika) i wykonuję pętlę foreach do nokautu, aby dodać wiersze, gdy użytkownik wybierze nazwę użytkownika z listy wyboru. Oto moja Fiddle.Numer wiersza tabeli przy wiązaniu knockout foreach

HTML

<div> 
    <table class="table table-bordered"> 
     <thead> 
      <th>#</th> 
      <th>User Name</th> 
      <th>User Surname</th> 
     </thead> 
     <tbody data-bind="foreach: users"> 
      <tr data-bind="if: userselected"> 
       <!-- The table row number --> 
       <td data-bind="text: $index() + 1"></td> 
       <td data-bind="text: username"></td> 
       <td data-bind="text: usersurname"></td> 
      </tr> 
     </tbody> 
    </table> 
</div> 

JS

var myViewModel = { 
    users: ko.observableArray([{ 
     username: 'Name 1', 
     usersurname: 'Surname 1', 
     userselected: ko.observable(false) 
    }, { 
     username: 'Name 2', 
     usersurname: 'Surname 2', 
     userselected: ko.observable(false) 
    }, { 
     username: 'Name 3', 
     usersurname: 'Surname 3', 
     userselected: ko.observable(false) 
    }]) 
}; 

$(document).ready(function() { 
    //Bind View model 
    ko.applyBindings(myViewModel); 
}); 

Problem pojawia się, gdy użytkownik wybierze Użytkownicy 1 i 3 indeksie $() + 1 nie pracować dla numeru wiersza.

Potrzebuję sposobu, aby dynamicznie ustawić numer wiersza.

Z góry dziękuję.

+0

Co dokładnie nie działa? Wydaje mi się to w porządku. –

+0

Chcę numer wiersza nie indeks tablicy –

+0

Oczywiście, ale jeśli wybiorę wiersz 1 i 3, widzę wiersz 1 i 3 w tabeli, z poprawnym indeksem w kolumnie #. Co dokładnie jest nie tak? –

Odpowiedz

14

Utworzę obliczone obserwowalne miejsce, w którym wykonuję filtrowanie. Następnie $index() zapewni prawidłowe rownumbers:

więc dodać nową właściwość selectedUsers do swojej myViewModel:

myViewModel.selectedUsers = ko.computed(function() { 
    return ko.utils.arrayFilter(myViewModel.users(), function (item) { 
     return item.userselected(); 
    }); 
}); 

następnie wiążą się z nim w tabeli:

<tbody data-bind="foreach: selectedUsers"> 
     <tr> 
      <!-- The table row number --> 
      <td data-bind="text: $index() + 1"></td> 
      <td data-bind="text: username"></td> 
      <td data-bind="text: usersurname"></td> 
     </tr> 
</tbody> 

Demo JSFiddle.

+0

Thanx. To właśnie chciałem –

+0

Ładne rozwiązanie. Używam tego podejścia za każdym razem, gdy robię sortowanie/filtrowanie logiki w powiązaniu HTML. –

Powiązane problemy