2013-08-25 3 views
11

Ich habe eine Tabelle, wo die Zeilen über ng-repeat wiederholt werden. Ich versuche, eine Vorlage zu erstellen, die Spalten <td> für jede Zeile erzeugt <tr>Direktive funktioniert nicht innerhalb <tr> das ist ng-repeat gebunden

app.directive("customtd", function(){ 
    return { 
    restrict: 'E', 
    template: "<td>{{position.Name}}</td><td>{{position.Code}}</td>", 
    replace: true, 
    scope: { 
     position: '=' 
    } 
    } 
}); 
<table> 
    <tr ng-repeat="p in positions"> 
    <customtd position="p"></customtd> 
    </tr> 
</table> 

Das Problem ist meine Gewohnheit td Vorlage überhaupt nicht wiedergegeben wird. Hier beabsichtige ich, <customtd> durch n Nummer <td> s zu ersetzen - was basierend auf der Anzahl der Eigenschaften auf meinem Datenobjekt entschieden wird, aber im Moment versuche ich nur eine einfache Direktive zu erhalten, die zwei Spalten ausgibt.

MYPLUNKER: zeigt eine Instanz dieses Problems und den Anweisungscode.

+1

, wenn Sie an der Konsole sehen sie einen Fehler wirft sagen 'Tem Platte muss genau ein Wurzelelement haben. war: {{position.Name}} {{position.Code}} ' –

+0

jetzt ist die Frage, ob die Tabellenreihe irgendwelche anderen Spalten als die hat, die durch die' customtd' Richtlinie zur Verfügung gestellt wird ... –

+0

Die Schablone die Sie für eine Direktive verwenden, sollte ein einzelnes Wurzelelement haben. Da in Ihrem Fall gibt es mehrere 'td 'daher der Fehler. Ich sehe keinen Weg, wie Sie Ihre 'td' Elemente in ein Wurzelelement einbinden können, da das einzige erlaubte Elternteil'tr' ist. – Chandermani

Antwort

6

Wie in Kommentaren erwähnt, sollte die Vorlage einer Direktive ein einzelnes Wurzelelement haben. So würde ich Ihnen vorschlagen, das tr Element der Vorlage der Richtlinie zu verschieben, wie folgt aus: http://plnkr.co/edit/YjLEDSGVipuKTqC2i4Ng?p=preview

+0

Danke, dass ich gearbeitet habe. Ich war enttäuscht, die Direktiven mit dem Typ 'Element' zu sehen ng-repeat nicht viel nutzen. Deine Lösung hat funktioniert. Ich habe es erweitert, um Header anzuzeigen, indem ich die Schlüssel auf dem Datenobjekt ansehe. http://plnkr.co/edit/BEi7an1yhvc4pMgRNTAt?p=preview – dotnetcoder

2

Als Pavlo schrieb, können Sie das tr Element der Vorlage für die Richtlinie bewegen. Eine andere Option ist die Verwendung eines td Elements und einer Direktive, die Ihre td durch die Vorlage ersetzt, die Sie verwenden möchten.

<table> 
    <tr ng-repeat="p in positions"> 
    <td replace-me template="mytemplate.html" position="p"></td> 
    </tr> 
</table> 

Richtlinie replaceMe

.directive("replaceMe", ["$compile", '$http', '$templateCache', function ($compile, $http, $templateCache) { 
     return { 
      restrict: 'A', 
      scope: { 
       position: "=" 
      }, 
      link: function (scope, element, attrs) { 
       function getTemplate(template) { 
        $http.get(template, {cache: $templateCache}).success(function (templateContent) { 
         element.replaceWith($compile(templateContent)(scope)); 
        }); 
       } 
       scope.$watch(attrs.template, function() { 
        if (attrs.template) { 
         getTemplate(attrs.template); 
        } 
       }); 


      } 
     } 
    }]); 

mytemplate.html

<td>{{position.Name}}</td> 
<td>{{position.Code}}</td> 
<td another-my-directive></td> 

plunker