2013-08-28 4 views
9

Meine Frage ist ähnlich wie this one, aber anstelle von Zeile vor, ich möchte es anhängen.AngularJS - append Zeile nach Element in der Direktive

Dies funktioniert nicht:

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); 
    } 
    } 
}); 

Antwort

16

Dies hat den Zweck erfüllt:

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 hat keinen insertAfter, wenn Sie also jQuery nicht verwenden, müssen Sie stattdessen .after verwenden. – Andrew

+0

Frage: Warum müssen Sie die Elemente austauschen? Ich bin mir nicht sicher, warum es nicht "nur funktioniert", wenn Sie die einzufügenden Elemente an das aktuelle Element anhängen. – Claudiu

+0

Der Austausch ist erforderlich, da jede Zeile der Wiederholung an der ursprünglichen Position gerendert wird (vor allen Zeilen, die wir bereits angehängt haben). Der Swap prüft also nur, ob eine angehängte Zeile dahinter steht und verschiebt sie vor die aktuelle Zeile. – noj

3

Ich glaube, Sie brauchen

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

Danke, aber es funktioniert nicht, wie ich will - es alle Zeilen am Ende der Tabelle anhängen. Siehe mein Update: http://jsfiddle.net/3gt9J/2/ – kuboslav

0

Ich wollte nur etwas hinzufügen, weil ich einige Minuten hatte, bis es funktionierte. Wenn Sie jQuery in Ihrem Projekt nicht haben, können Sie nicht verwenden. Verwenden Sie einfach after() von jQuery API .after()

Ich musste einige Elemente in meiner Direktive zwischen anderen Kindern hinzufügen.

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