2014-01-29 14 views
5

ich eine HTML-Tabelle haben und die Reihen kommen eine beobachtbare Array bilden ....Statische Zeile über knockout.js beobachtbaren Array Tabelle

<tbody data-bind="foreach: TableArray"> 
    <tr> 
     <td data-bind:"text: Item1"></td> 

etc ....

Wie kann ich die überspringen erste Reihe ... so kann ich eine statische Reihe (keine Überschrift) zum Anfang der Tabelle hinzufügen.

<tbody data-bind="foreach: TableArray"> 
    <tr> 
     <td> Static Row </td> 
    </tr> 
    <tr> 
     <td data-bind:"text: Item1"></td> 

Antwort

11

Das Geheimnis ist in der Containerless foreach Markup. Check "Anmerkung 4" von dem folgenden Link:

http://knockoutjs.com/documentation/foreach-binding.html

Hier ist eine Geige ein einfaches Beispiel zeigt.

http://jsfiddle.net/internetH3ro/M9f4D/7/

Grundansicht Modell:

function ViewModel() { 
    var self = this; 
    self.items = [{ 
     firstName: 'James', 
     lastName: 'McConnell' 
    },{ 
     firstName: 'Scott', 
     lastName: 'Hanselman' 
    },{ 
     firstName: 'Bill', 
     lastName: 'Gates' 
    }]; 
} 

HTML-Markup:

<table> 
    <tr> 
     <th>First Name</th> 
     <th>Last Name</th> 
    </tr> 
    <!-- ko foreach: items --> 
    <tr> 
     <td><span data-bind="text: $data.firstName"></span></td> 
     <td><span data-bind="text: $data.lastName"></span></td> 
    </tr> 
    <!-- /ko --> 
</table> 

So wickeln Sie nur die Inhalte, die Sie in einem Kommentar wiederholt werden soll, und Knockout wird wiederholen, dass der Inhalt für jedes Element in Ihrer Sammlung. Ziemlich geschickt, ich wünschte, Angular hätte so etwas.

+0

über Angular Zustimmen; vielleicht hat AngularJS nicht die containerlose Bindesyntax, aber es bietet eine knappe Syntax, die die gleiche Funktionalität wie Knockouts "foreach" ohne Container bietet. http://StackOverflow.com/a/21446102/538962 – mg1075

+0

Dies ist die richtige Antwort - Schande, dass "user314 ..." konnte nicht belästigt werden, um Ihnen die Antwort Kredit geben. –

+0

Meh, nicht allzu besorgt darüber. Ich komme hierher, um Hilfe zu bekommen, und versuche, es zurückzugeben, wenn ich kann. Das ist alles, woran ich wirklich interessiert bin. :) Danke für die Anerkennung, aber, sehr geschätzt! –

2

Sie könnten eine if binding verwenden, um nur eine zusätzliche Zeile im "ersten" Durchgang auszugeben.

Example:

<table data-bind ="foreach: rows"> 

    <tr data-bind="if: $index() == 0" > 
    <td><span data-bind="text: $index"></span></td> 
    </tr> 
    <tr> 
    <td><span data-bind="text: text"></span></td> 
    </tr> 
</table> 
3

Eine Möglichkeit, das Problem zu nähern, wäre Knockout der behälterlosen Bindungssyntax zu verwenden. Siehe Anmerkung 4 in Knockouts Dokumentation der foreach Bindung.
http://knockoutjs.com/documentation/foreach-binding.html


Javascript

var YourVM = function() { 
    this.allItems = ko.observableArray(["Fries", "Eggs Benedict", "Ham", "Cheese"]); 
}; 

ko.applyBindings(new YourVM()); 

HTML

 <table> 
     <thead> 
     <tr> 
      <th>Your Column</th> 
     </tr> 
     </thead> 
     <tbody> 
     <tr class="row-static"> 
      <td>Static Row</td> 
     </tr> <!-- ko foreach: allItems --> 
     <tr> 
      <td data-bind="text: $data"></td> 
     </tr> <!-- /ko -->  
     </tbody> 
    </table> 

Live-Beispiel auf JS Bin
http://jsbin.com/AzEwEce/1/edit

+0

Große Köpfe denken gleich. ;) –

+0

@JamesMcConnell - stimme definitiv mit dir über Angular in dieser Hinsicht überein. https://github.com/angular/angular.js/issues/1891 – mg1075