2016-06-03 5 views
0

Ich habe eine Winkelanwendung, die einen ng-repeat-start verwendet, um einige dynamische Informationen anzuzeigen.Manuelles transclude in Verbindung mit ng-repeat

<div> 
    <table> 
    <tbody> 
     <tr my-directive ng-repeat="data in vm.data"> 
     <td ng-bind="data.id"></td>  
     <td ng-bind="data.id"></td>  
     </tr> 
     <tr ng-repeat-end> 
     <td>extrarow</td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

Ich baute auch eine Richtlinie, die ich eine Klasse für die gesamte tr anzuwenden, je nach dem Wert von einigen der Daten verwendet werden soll. Ich wollte Link verwenden, um das zu tun, anstatt eine $ Uhr zu verwenden.

Da das selbst viele enthalten kann, wollte ich transclude verwenden, um dies zu tun. Ich möchte nicht, dass der Tag in meiner Tabelle eingefügt werden, da dies all meine Designs bricht, so dass ich dies manuell tun, so etwas wie diese:

function myDirective() { 
    return { 
     transclude: true, 
     scope: {}, 
     link: function($scope, $element, $attrs, $ctrl, $transclude) { 
      var cloned = $transclude(); 
      $element.append(cloned);    
     } 
    } 
} 

Das Problem ist, das funktioniert nicht wie erwartet. Das geklonte Objekt wird nur an die letzte Zeile der ng-Wiederholung angehängt. Wahrscheinlich liegt das an dem $ element-Objekt, aber ich bin mir nicht sicher.

Ich reproduziert das Problem in diesem jsfiddle.

Irgendwelche Ideen, wo das Problem liegt? Vielen Dank. Sie nicht zu viele haben

+0

Nicht sicher, was Sie versuchen, zu erreichen, aber die transcluden entfernen: true aus Ihrer Richtlinie https://jsfiddle.net/tf9s7skq/1/ Wenn Sie einfach sind versucht, die TR einstellen Klasse basierend auf den Daten, benutze element.css() - die Einblendung sieht hier wie das Falsche aus. – RamblinRose

+0

Nicht sicher, was transclude: false tut, aber Sie haben Recht, alle meine Elemente werden angezeigt, aber auch ein Fehler als $ transclude ist keine Funktion mehr. Außerdem wird die letzte Extrarow nur für die letzte Zeile angezeigt. Auch dies ist ein einfaches Beispiel, aber in meiner App habe ich eine wirklich große Tabelle mit vielen Zellen pro Zeile; Deshalb verwende ich transclude. Ich möchte diese Zellen nicht verlieren, wenn ich die Richtlinie anwende. – David

+0

Ok, @RamblinRose, ich merke nur, dass du Recht hast, da ich keine Vorlage habe, brauche ich keine Transkription, es ist viel einfacher. Danke – David

Antwort

1

ich verwirrt bin, warum Sie transcluden sind erforderlich. Ich denke this is what you're looking for; Aber ich muss sagen, ich bin nicht überzeugt von der Wirtschaft von $ beobachten über $ watch hier.

Für $ beachten, ich habe folgendes TR hinzugefügt:

<tr my-directive data-value="{{data.id}}" ng-repeat="data in vm.data"> 

und die Richtlinie zeigt auf eine Bedingung, die Klasse zu ändern.

function myDirective() { 
     return { 
     link: function($scope, element, attrs) { 
      attrs.$observe('value', function(val) { 
      if (val && val == "9.2") 
       element.addClass("myClass"); 
      else 
       element.removeClass("myClass"); 
      });    
     } 
    } 
    } 
+0

Danke, @RamblinRose, du hattest Recht; vorher benutzte ich eine Vorlage und ich musste transclude verwenden; Ich habe einfach nicht gemerkt, dass ich in diesem Fall nicht mehr muss. – David

0

Wenn Sie können eine Klasse je nach Inhalt hinzufügen möchten Sie ng-class verwenden

<td ng-bind="data.id" ng-class="{'myClass': data.id > 4}"></td> 

EDIT

Sie können eine einmalige Bindung, verwenden Sie dann $watchers

<td ng-bind="data.id" ng-class="::{'myClass': data.id > 4}"></td> 
+0

Ich weiß, ich möchte nicht ng-Klasse verwenden. Ich muss so etwas in meinem Tisch oft wiederholen und das bringt viele $$ Beobachter. Ich möchte $ beobachten, um dies zu tun, und daher muss ich transclude verwenden. – David

+0

Ich habe meinen Beitrag bearbeitet –

+0

Nein, meine Klasse ist dynamisch, und auch die data.id, die ich verwende, so dass einmalige Bindung keine Option ist. – David

1

Einstellung transcluden auf false in Ihrer Richtlinie wird Sie die ganze Liste geben.

0

Wenn Sie eine andere benutzerdefinierte ng-repeat-Direktive ausführen möchten, die Sie geschrieben haben, können Sie eine andere Priorität für Ihre ng-repeat-Direktive festlegen. Eine niedrigere Priorität als die Standard-Anweisung ng-repeat führt dazu, dass sie nach dem Standard ng-repeat ausgeführt wird.

ich Ihre jsFiddle mit einer Probe aktualisiert haben, https://jsfiddle.net/1x08vxpm/15/

angular.module('app', []) 

.controller('Controller', Controller)  
.directive('ngRepeat', ngRepeat); 

function ngRepeat() { 
    return {  
     priority: 0, 
     scope: {}, 
     link: function($scope, $element, $attrs) { 
      $element.css('color', 'red'); 
     } 
    } 
} 
+0

Ich möchte in der Lage sein, die Direktive in einem zu verwenden, um einen Stil für Zeilen, aber auch in einem , für einzelne Zellen anzuwenden, also kann ich diesen nicht verwenden. Es ist jedoch eine gute Idee für andere Szenarien. – David