2016-04-08 11 views
1

Ich baue eine Angular-Direktive, um ein Highchart.js-Bereichsdiagramm zu laden und einige Variablen davon zu übergeben.Http-Aufruf von einem Dienst innerhalb eines Direktiven-Controllers

Ich verwende die Richtlinie wie diese

<andamento-fondo-area-chart color="#3FAE2A" url="../data.json"></andamento-fondo-area-chart> 

Ich versuche, die URL mit den JSON-Daten aus der Richtlinie selbst zu übergeben, machen den HTTP-Aufruf über einen Dienst und dann die Daten in der Richtlinie selbst verwenden um das Diagramm zu erstellen.

Unten sehen Sie den Code, den ich für den Dienst und die Richtlinie geschrieben habe. In der Richtlinie Controller, nach dem Service-Aufruf sende ich den $ -Scope an die Konsole und dann sende ich die $ scope.data.

Was ich nicht verstehe, ist, wenn ich den $ scope ausgibt, habe ich das Datenarray darin, gefüllt mit meinen Daten. In der nächsten Zeile gib die $ scope.data selbst aus und es gibt mir "undefined".

see image to see my console output

Haben Sie eine Ahnung, warum?

//Service 
    OLS.service('dataService', function($http) { 
     delete $http.defaults.headers.common['X-Requested-With']; 
     this.getData = function(url) { 
      return $http({ 
       url: url 
      }); 
     } 
    }); 

//Graph Directive using Highchart 

OLS.directive('andamentoFondoAreaChart', function($http, dataService){ 
    return { 
     restrict: 'E', 
     template: '<div id="areaGraphContainer" style="width:100%;"></div>', 
     scope: { 
      url: '@', 
      color: '@' 
     }, 
     controller: function($scope){  
      dataService.getData($scope.url).then(function(dataResponse) { 
       $scope.data = dataResponse; 
      }); 
      console.log($scope); 
      console.log($scope.data);   
     }, 
     link: function (scope, element, attrs) {   
      Highcharts.chart('areaGraphContainer', { 
       chart: { 
        type: 'area', 
        ... 
       }, 
       title.: { 
        ... 
       }, 
       ..., 
       series: [{ 
        color: scope.color, 
        ..., 
        data: scope.data 
       }] 
      }); 
     } 
    }; 
}); 
+0

'dataService.getData ($ scope.url) .then (function (dataResponse) { $ scope.data = dataResponse; console.log ($ scope); console.log ($ scope.data); }); ' Was, wenn Sie das mögen? – Chrillewoodz

+0

@Chrillewoodz Wenn ich es innerhalb des Dienstes anrufe, gibt es die Daten korrekt zurück. Aber ich brauche sie außerhalb des Dienstes, insbesondere brauche ich es innerhalb der Link-Funktion der Richtlinie. Danke für deine Antwort –

Antwort

0

Schauen Sie hier:

dataService.getData($scope.url).then(function(dataResponse) { 
      $scope.data = dataResponse; 
     }); 
console.log($scope); 
console.log($scope.data);   

Wenn Sie versuchen, scope.data $ zu drucken, wird $ Umfang es nicht, weil Data nicht Anfrage abgeschlossen ist, versuchen $ scope.data zu den acces innen .then:

dataService.getData($scope.url).then(function(dataResponse) { 
      $scope.data = dataResponse; 
      console.log($scope.data); 
     }); 

UPDATE

dies vielleicht mit $ wa versuchen tch?

link: function (scope, element, attrs) { 
     scope.$watch('data', function(newVal) { 
     if(newVal) { Highcharts.chart('areaGraphContainer', ...);} 
    }, true);  
+0

Wenn ich es innerhalb des "then" Ereignisses anrufe, habe ich die Daten, das Problem ist, dass ich diese Daten in den Bereich binden muss, damit ich sie in die "Link" Funktion der Direktive einbetten kann Daten in das Diagramm, wie Sie in der Eigenschaft series.data des Diagrammaufrufs sehen können, setze ich es gleich scope.data, aber natürlich kommen die Daten dort nicht. Plus: die komische Sache ist, dass, wenn ich nur den Bereich drucke, ich die Daten in den Objektdaten habe, aber wenn ich den scope.data drucke, habe ich es nicht. Vielen Dank für die Hilfe. –

+0

Bitte sehen Sie aktualisierte Antwort. – strelok2010

+0

Die aktualisierte Antwort funktioniert. Ich danke dir sehr. Also im Grunde die "Watch" -Funktion nur "warten" auf die Daten zu füllen? Es tut mir leid, frage ich, aber ich bin relativ neu in eckigen und ich versuche nur so schnell wie möglich zu lernen. –

Verwandte Themen