2016-07-06 11 views
5

Ich habe eine HTML-Vorlage, die Daten aus dem Array des Controllers lädt und in einer Tabelle speichert. Auch ich habe eine Direktive, die die Einbeziehung in Tabellenzeilen macht. Das Datenarray wird auf API-Anfragen gefüllt. Nach den neuen Anfragen habe ich die Anfrageergebnisse in meiner Tabelle zusammengeführt. Eine Reihe von Zeilen wird für jede Anfrage hinzugefügt, anstatt vorhergehende Ergebnisse zu löschen.vorherige Daten vor Anforderung löschen

Ich habe über meinen Controller-Code debugged, um den Zustand meines Arrays zu überprüfen, und es wird vor jeder Anfrage gelöscht. Das ist sicher. Jedoch werden neue Ergebnisse zu vorherigen hinzugefügt. Ich denke, der Grund könnte in meiner Vorlage der Transklusionsrichtlinie liegen.

Die Vorlage sieht so aus:

<div class="row"> 
    <div class="col-md-12"> 
     <div id="results" ng-show="results.length > 0"> 
      <table class="table result-table"> 
       <thead> 
        <tr> 
         <th>1</th> 
         <th>2</th> 
         <th>3</th> 
         <th>4</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr ng-repeat="result in results" my-result></tr> 
       </tbody> 
      </table> 
     </div> 
    </div> 
</div> 

Hier ist der Code meiner Einbindung Direktive ist:

angular.module('app').directive('myResult', 
['$compile', 
function ($compile) { 
    return { 
     transclude: true, 
     templateUrl: '/Scripts/app/templates/resultTemplate.html', 
     compile: function (tElement, tAttr, transclude) { 
      var contents = tElement.contents().remove(); 
      var compiledContents; 
      return function (scope, iElement, iAttr) { 
       if (!compiledContents) { 
        compiledContents = $compile(contents, transclude); 
       } 
       compiledContents(scope, function (clone, scope) { 
        iElement.replaceWith(clone); 
       }); 
      }; 
     } 
    } 
}]); 

Und schließlich die für Einbindung verwendet Vorlage:

<tr class="big-bord"> 
    <td colspan="4"><h3>{{result.fullName}}</h3></td> 
</tr> 
<tr ng-repeat="item in result.items"> 
    <td>{{item.value1}}</td> 
    <td>{{item.value2}}</td> 
    <td>{{item.value3}}</td> 
    <td>{{item.value4}}</td> 
</tr> 

Wie kann ich Löschen Sie meine Ergebnisse vor jeder API-Anfrage?

+0

Welche Version von Angular verwenden Sie? Laut den Angular 1.4-Dokumenten wurde compile (transclude) als veraltet eingestuft. – jbrown

+0

jbrown, verwende ich Angular 1.5.7. Was kommt anstelle der Transkription? – Waldemar

+0

Der Angular Docs-Status "verwenden Sie stattdessen die Transclude-Funktion, die an die Link-Funktion übergeben wird". Lesen Sie hier mehr: https://docs.angularjs.org/api/ng/service/$compile – jbrown

Antwort

4

Ich löste mein Problem. Es stellte sich heraus, dass mehrere <tbody> Tags innerhalb einer Tabelle erlaubt sind. So zog ich gerade meine ng-repeat zu <tbody> tag:

<tbody ng-repeat="result in results"> 
    <tr class="big-bord"> 
     <td colspan="4"><h3>{{result.fullName}}</h3></td> 
    </tr> 
    <tr ng-repeat="item in result.items"> 
     <td>{{item.value1}}</td> 
     <td>{{item.value2}}</td> 
     <td>{{item.value3}}</td> 
     <td>{{item.value4}}</td> 
    </tr> 
</tbody> 

Also, ich habe keine Richtlinien müssen überhaupt.

+1

Wenn Sie mehrere 'tbody' vermeiden wollen, Sie kann 'ng-repeat-start' in der ersten Zeile und' ng-repeat-end' in der zweiten Zeile verwenden. [Weitere Informationen] (https://docs.angularjs.org/api/ng/directive/ngRepeat). –