2012-03-26 9 views
7

Ho il seguente modello di tabella che è resa attraverso l'eliminazione diretta:Knockout: righe della tabella selezionabili senza estendere il modello?

  <table class="gv" data-bind="visible: products().length > 0"> 
       <thead> 
        <th>Type</th> 
        <th>Name</th> 
       </thead> 
       <tbody data-bind="foreach: products"> 
        <tr data-bind="click: $root.selectProduct"> 
         <td data-bind="text: type"></td> 
         <td data-bind="text: name"></td> 
        </tr> 
       </tbody> 
      </table> 

Ora voglio fare le righe cliccabili e vuole assegnare una classe CSS, se viene selezionata una riga. È possibile selezionare solo 1 riga (!) Alla volta, quindi è necessario deselezionare gli altri.

Il modo più semplice sarebbe estendere il mio modello (classe prodotto) con una proprietà selezionata ma ciò distruggerebbe il mio mapping 1: 1 con il lato server.

Come si può risolvere questo problema? Come gestiresti questo?

risposta

16

Questa era la mia soluzione finale ora, pulsanti di opzione senza supplemento nascosti:

<tr data-bind="click: $root.selectProduct, css: { 'active-row': $root.selectedProduct() === $data }"> 

e l'implementazione selectedProduct all'interno del ViewModel:

function AppViewModel() { 
    // Private 
    var self = this; 

    // Public Properties 
    self.selectedProduct = ko.observable(); 
+0

Per completezza di risposta, mi piacerebbe vedere definito Prodotto selezionato. – TelegramSam

+1

@TelegramSam Un po 'tardi ma eccolo qui. – timmkrause

+0

@jtkrause Perché la proprietà selectProduct è un osservableArray e non un oggetto solo osservabile - un oggetto - quando si consente solo una singola selezione? – Elisabeth

1

È possibile aggiungere un gruppo di pulsanti di opzione nascosti alla tabella e quando viene selezionata la riga chiamando selectProduct il pulsante di opzione è selezionato.

Ciò garantisce che sia selezionata una sola riga.

In alternativa è possibile scrivere un custom binding utilizzando il jQuery .data() per specificare la riga selezionata.

+0

Il pulsante di scelta suona bene ed utilizza browser standard/html tecniche per gestire la selezione unica. Preferiresti anche questa soluzione? – timmkrause

+0

Ecco come vorrei prima affrontarlo, ma sarei consapevole che se in futuro avessi richiesto più selezioni, dovrei riscriverlo. – Darbio

+0

Questo sicuramente non succederà! Grazie! – timmkrause

Problemi correlati