2013-08-28 18 views
9

La mia domanda è simile a this one, ma invece di anteporre la riga, voglio aggiungerla.AngularJS - aggiungi riga dopo elemento nella direttiva

Questo non funziona:

app.directive('createTable', function ($compile) { 
    return { 
    link: function (scope, element, attrs) { 
     var contentTr = angular.element('<tr><td>test</td></tr>'); 
     contentTr.parentNode.insertBefore(element, contentTr.nextSibling); 
     $compile(contentTr)(scope); 
    } 
    } 
}); 

risposta

16

Questo fa il lavoro:

app.directive('createTable', function ($compile) { 
    return { 
     link: function(scope, element, attrs) { 
      if (element.next().length) { 
       element.next().insertBefore(element); 
      } 

      var contentTr = angular.element('<tr><td>test</td></tr>'); 
      contentTr.insertAfter(element); 
      $compile(contentTr)(scope); 
     } 
    } 
}); 

http://jsfiddle.net/3gt9J/3/

+16

jqLite non ha insertAfter quindi se non stai usando jQuery devi usare .after invece. – Andrew

+0

Domanda: perché è necessario scambiare gli elementi? Non sono chiaro perché non "funziona" solo se si aggiungono gli elementi da inserire nell'elemento corrente. – Claudiu

+0

Lo scambio è necessario perché ogni riga della ripetizione esegue il rendering nella posizione originale (prima di tutte le righe che abbiamo già aggiunto). Quindi lo swap controlla solo se c'è una riga aggiunta dopo e la sposta prima della riga corrente. – noj

3

Penso che è necessario

app.directive('createTable', function ($compile) { 
    return { 
     link: function (scope, element, attrs) { 
      var contentTr = angular.element('<tr><td>test</td></tr>'); 
      contentTr.insertAfter(element); 
      $compile(contentTr)(scope); 
     } 
    } 
}); 

Demo: Fiddle

+1

Grazie, ma non funziona come voglio: aggiunge tutte le righe alla fine del tavolo. Vedi il mio aggiornamento: http://jsfiddle.net/3gt9J/2/ – kuboslav

0

Volevo solo aggiungere qualcosa perché avevo qualche minuto prima che funzionasse. Se non hai jQuery nel tuo progetto non puoi usare lo insertAfter. Basta usare after() da jQuery API .after()

Ho avuto bisogno di aggiungere alcuni elementi nella mia direttiva tra altri bambini.

element.children().eq(0).after(angular.element('<p>Test</p>')); 
Problemi correlati