2012-03-26 5 views
7

Ich habe die folgende Tabelle Vorlage, die durch Knockout wiedergegeben wird:Knockout: Wählbare Tabellenzeilen ohne Erweiterung des Modells?

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

Jetzt möchte ich die Zeilen klickbare machen und wollen eine CSS-Klasse zuweisen, wenn eine Zeile ausgewählt ist. Es kann immer nur 1 (!) Zeile ausgewählt werden, andere müssen deaktiviert werden.

Der einfachste Weg wäre, mein Modell (Produktklasse) um eine ausgewählte Eigenschaft zu erweitern, aber dies würde mein 1: 1-Mapping mit der Serverseite zerstören.

Wie soll ich dieses Problem lösen? Wie würden Sie damit umgehen?

Antwort

16

Das war jetzt meine endgültige Lösung, keine extra versteckte Radiobuttons:

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

Und die selectedProduct Umsetzung im Ansichtsmodell:

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

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

Für die Vollständigkeit der Antwort würde ich gerne selectProduct definiert sehen. – TelegramSam

+1

@TelegramSam Ein bisschen spät, aber hier ist es. – timmkrause

+0

@jtkrause Warum ist Ihre Eigenschaft selectProduct ein observableArray und nicht nur eine Observable - ein Objekt - wenn Sie nur eine einzige Selektion zulassen? – Elisabeth

1

Sie können der Tabelle eine ausgeblendete Optionsfeldgruppe hinzufügen, und wenn die Zeile ausgewählt ist, die selectProduct aufruft, ist das Optionsfeld ausgewählt.

Damit wird sichergestellt, dass nur eine Zeile ausgewählt ist.

Alternativ können Sie eine custom binding mit dem jQuery .data() schreiben, um die ausgewählte Zeile anzugeben.

+0

Der Radioknopf hört sich gut an und nutzt Standard-Browser/html Techniken zur Handhabung der einzigartigen Auswahl. Würden Sie diese Lösung auch bevorzugen? – timmkrause

+0

So würde ich es zuerst angehen - aber ich wäre mir bewusst, dass ich, wenn ich in Zukunft mehrere Auswahlmöglichkeiten benötige, es neu schreiben müsste. – Darbio

+0

Das wird definitiv nicht passieren! Vielen Dank! – timmkrause