2015-03-06 6 views
5

Ich habe eine Tabelle mit einigen Daten in HTML anzuzeigen. Wenn ich auf Drucken klicke, muss ich alle Daten von db abrufen und ausdrucken. Ich erhalte die Daten und befülle die Modelldaten, wenn ich auf "Drucken" klicke, nur das Modell wird aktualisiert und der Ausdruck zeigt die alten Daten an. Im folgenden Code werden neue Elemente nicht zu Elementen hinzugefügt, wenn ich auf Drucken klicke.

http://jsfiddle.net/vijaivp/Y3BJa/306/

HTML

<div ng-app> 
    <div class="hidden-print" ng-controller="PrintCtrl"> 
     <br /> 
     <div id="overallPrint" class='visible-print' style="float:left;  margin-right:50px;"> 
      <h4>Overall Report</h4> 

      <table border="1"> 
       <thead> 
        <tr> 
         <td>Name</td> 
         <td>Price</td> 
         <td>Quantity</td> 
        </tr> 
       </thead> 
       <tbody> 
        <tr ng-repeat="item in items"> 
         <td>{{item.Name}}</td> 
         <td>{{item.Price}}</td> 
         <td>{{item.Quantity}}</td>      
        </tr> 
       </tbody> 
      </table> 

      <br> 
      <input type="button" value="Print Overall" ng-click='printOverallReport()' /> 
     </div> 
    </div> 
</div> 

JS

function PrintCtrl($scope, $window, $q) { 
    $scope.items = [ 

     {Name: "Soap", Price: "25", Quantity: "10"}, 
     {Name: "Shaving cream", Price: "50", Quantity: "15"} 
    ]; 

    $scope.newitems = [ 
     {Name: "Shampoo", Price: "100", Quantity: "5"} 
    ]; 

    $scope.printOverallReport = function() { 
     $scope.items.push($scope.newitems[0]); 
     $window.print(); 
    }; 
} 

Antwort

6

ein Timeout mit kantigem der $timeout-Dienst wird es beheben:

function PrintCtrl($scope, $window, $q, $timeout) { 
     $scope.items = [ 

      {Name: "Soap", Price: "25", Quantity: "10"}, 
      {Name: "Shaving cream", Price: "50", Quantity: "15"} 
     ]; 

     $scope.newitems = [ 
      {Name: "Shampoo", Price: "100", Quantity: "5"} 
     ]; 

    $scope.printOverallReport = function() { 
     $scope.items = $scope.newitems; 
     console.log($scope.items.length); 
     $timeout($window.print, 0); 
     console.log($scope.items.length); 
     }; 

} 

Fiddle

Für eine umfassende Erklärung, warum finden Sie DVK Antwort (2. eins) hier: Why is setTimeout(fn, 0) sometimes useful?

TL: DR;

Wenn Sie $window.print() aufrufen, ist das alte HTML immer noch vorhanden, da der Browser es noch nicht gerendert hat. Es wartet darauf, die JavaScript-Funktion zu beenden. Wenn Sie ein $ timeout 0 setzen, wird der Ausdruck am Ende der Ausführungswarteschlange in die Warteschlange gestellt und es wird garantiert, dass dies geschieht, nachdem der HTML-Code gerendert wurde. (Ich empfehle immer noch dringend, seine Antwort zu lesen)

+0

Vielen Dank für Ihre Antwort, Ihr Update arbeitete für Beispieldaten. Aber wir haben eine Bedingung, bei der wir eine DOM-Manipulation durchführen, um die DOM-Divs basierend auf dem Berichtstyp ein- oder auszublenden. JS Geige hier - http://jsfiddle.net/vijivac/Y3BJa/309/ Der detaillierte Bericht erhält nicht das aktualisierte Ergebnis zum Drucken. Können Sie überprüfen und lassen Sie mich wissen, was hier das Problem wäre. – vijayanand

+0

@vijayanand Dies funktioniert: http://jsfiddle.net/Y3BJa/310/ Sie mussten nur die Elementauswahl abbrechen, da die Funktion beendet werden musste, bevor die Änderung 'ditems = newitems' stattfand. –

+0

U Felsen Mann, ... wirklich funktioniert es jetzt gut, .... Thnks viel .. !! :) – vijayanand