2016-12-01 2 views
0

Ich habe ein Problem mit meinem Skript, das Daten aus der Datenbank in Teilen sammelt. Ich möchte Angular informieren, wenn das Herunterladen der Daten abgeschlossen ist, also habe ich $ watch verwendet. Leider funktioniert es nicht. Winkelaufrufe funktionieren am Anfang anstatt nach dem Laden der ÄnderungVollständiger Wert.

angular 
.module('app') 
.controller('tlmController', function($scope, $http) { 
    var vm    = this; 
    var data   = []; 
    vm.countTestLines = 0; 
    vm.loadingComplete = false; 

    $scope.$watch('vm.loadingComplete', function() { 
     console.log(data); 
    });  

    $http({ 
     method: 'GET', 
     url: 'app/server/tt/count_testlines.php' 
    }).then(function successCallback(response) { 
     vm.countTestLines = parseInt(response.data.count); 

     downloadInParts(data, 0, vm.countTestLines); 

    }, function errorCallback(response) { 
     console.log('error'); 
    }); 

    var downloadInParts = function(data, offset, max) {   
     if(max < offset) { 
      vm.loadingComplete = true; 
      return; 
     } 

     $http({ 
      method: 'GET', 
      url: 'app/server/tt/get_testlines.php', 
      params: { offset: offset } 
     }).then(function successCallback(response) { 
      data = data.concat(response.data);   
      downloadInParts(data, offset + 5, max); 
     }, function errorCallback(response) { 
      console.log('error'); 
     }); 


    } 

}); 
+0

Ich bin kein Angular Typ, aber haben Sie versucht, newValue und oldValue zu Listener Param in '$ watch' Methode übergeben? Und dann könntest du 'if (newValue! == oldValue)' checken und deine Änderungen bearbeiten. –

+0

Wenn eine der folgenden Antworten Ihr Problem gelöst hat, können Sie eine davon als Antwort akzeptieren. – Danscho

Antwort

0

Das Problem ist, dass die loadingComplete nicht Teil des Umfangs ist. Sie sollten es als $scope.loadingComplete; deklarieren.

+0

Ja, es gehört zum Umfang als vm = this! – Danscho

+0

Soweit ich weiß, wird das loadingComplete eine Eigenschaft des Controllers. Um watch zu verwenden, sollte loadingComplete eine Eigenschaft des $ scope-Objekts sein. – asdadasfff

+0

Nicht unbedingt. Wenn Sie controllerAs Syntax verwenden. Werfen Sie einen Blick auf diese Styleguide: https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#style-y032 – Danscho

0

Wenn Sie var vm = this verwenden, die die richtige Art und Weise für AngularJS zu JohnPapa's styleguide nach, sollten Sie Ihre $ Uhr neu schreiben zu:

$scope.$watch(function(){ return vm.loadingComplete }, function() { 
    console.log(data); 
}); 

Update von Kommentaren: Ihre Funktionsparameter data versteckt Ihre data Variable von Ihrem Controller.

+0

Ich sehe den Fortschritt, aber jetzt Konsolenprotokoll gibt ein leeres Array zurück (aber variable Daten wird richtig gefüllt) –

+0

setzt es loadingComplete auf True und dann triggern die $ watch? – Danscho

+0

Ich musste vm.data anstelle der lokalen Datenvariablen verwenden. Ich weiß nicht warum, weil die Datenvariable im Funktionsumfang sichtbar sein sollte. –

0

Da Sie 'vm' anstelle von '$ scope' verwenden, müssen Sie $ scope. $ Apply in Ihre Funktion einfügen.

if(max < offset) { 
    vm.loadingComplete = true; 
    $scope.$apply(); 
    return; 
    } 

$ scope Uhren immer in Wertänderung und wenn es ist, Angular wird die $ Digest() Funktion intern und der geänderte Wert wird aktualisiert nennen. Mit 'vm' wird der Wert, der zu Ihrem Problem führt, nicht aktualisiert.

Verwandte Themen