2013-08-25 8 views
11

Ho una tabella in cui le righe vengono ripetute tramite ng-repeat. Sto cercando di creare un modello che genera colonne <td> per ogni riga <tr>non funziona all'interno di <tr> che è ng-repeat bound

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> 

Il problema è il mio modello TD personalizzato non è resa a tutti. Qui ho intenzione di sostituire <customtd> con n numero di <td> s - che sarà deciso in base al numero di proprietà sul mio oggetto dati, ma al momento sto solo cercando di ottenere una semplice direttiva di lavoro che produrrà due colonne.

MYPLUNKER: mostra un'istanza di questo problema e il codice della direttiva.

+1

se si guarda alla console si sta gettando un errore che dice 'Tem la piastra deve avere esattamente un elemento radice. era: {{position.Name}} {{position.Code}} ' –

+0

ora la domanda è se la riga della tabella ha altre colonne oltre a quella fornita dalla direttiva' customtd' ... –

+0

Il modello che usi per una direttiva dovrebbe avere un singolo elemento radice. Dal momento che nel tuo caso ci sono più 'td' da qui l'errore. Non vedo un modo in cui è possibile avvolgere i propri elementi 'td' all'interno di un elemento radice, in quanto l'unico genitore consentito è' tr' – Chandermani

risposta

6

Come indicato nei commenti, il modello di una direttiva dovrebbe avere un singolo elemento radice. Quindi vi suggerisco di spostare l'elemento tr al modello della direttiva, in questo modo: http://plnkr.co/edit/YjLEDSGVipuKTqC2i4Ng?p=preview

+0

grazie a quello che ho funzionato ero piuttosto deluso nel vedere le direttive con il tipo 'Elemento' annidato in ng-repeat non fa molto uso. la tua soluzione ha funzionato. L'ho esteso per visualizzare le intestazioni guardando le chiavi sull'oggetto dati. http://plnkr.co/edit/BEi7an1yhvc4pMgRNTAt?p=preview – dotnetcoder

2

Come ha scritto Pavlo, è possibile spostare l'elemento tr al modello per la direttiva. Un'altra opzione è utilizzare un elemento e una direttiva td che sostituisce lo td con il modello che si desidera utilizzare.

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

direttiva 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