2016-04-08 6 views
1

Я создаю угловую директиву для загрузки графа области Highchart.js, передающего некоторые переменные из него.Http-вызов из службы внутри директивного контроллера

Я использую директиву, как этот

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

Я пытаюсь передать URL с JSON данных из самой директивы, сделать вызов HTTP через службу, а затем использовать данные внутри самой директивы для построения графика.

Ниже вы можете увидеть код, который я написал для службы и директивы. В контроллере директивы после вызова службы я отправляю $ scope на консоль, а затем отправляю $ scope.data.

То, что я не понимаю, это когда я выдаю $ scope, у меня есть массив данных внутри него, заполненный моими данными. На следующей строке выводится сама $ scope.data, и она дает мне "undefined".

see image to see my console output

У вас есть какие-либо идеи, почему?

//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 (функция (dataResponse) { $ scope.data = dataResponse; console.log ($ масштаб); console.log ($ scope.data); }); ' Что делать, если вам это нравится? – Chrillewoodz

+0

@Chrillewoodz, если я вызываю его внутри службы, он правильно возвращает данные. Но я нуждаюсь в них вне службы, в частности, мне нужно это внутри функции ссылки директивы. Спасибо за ваш ответ –

ответ

0

Посмотрите здесь:

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

При попытке напечатать $ scope.data, $ сфера не имеет, потому что DATASERVICE не завершен запрос, попробуйте Acces $ scope.data внутри .then:

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

UPDATE

Может попробовать это с $ пром чик?

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

Если я вызываю его внутри события «then», у меня есть данные, проблема в том, что мне нужно привязать эти данные к области, чтобы я мог использовать их в функции «ссылки» директивы для встраивания данные в графике, как вы можете видеть в свойстве series.data вызова диаграммы, я устанавливаю его равным scope.data, но, конечно, данные туда не попадают. Плюс: странно, что когда я печатаю только область, у меня есть данные в данных объекта, но когда я печатаю область scope.data, у меня ее нет. Btw благодарит за помощь. –

+0

Пожалуйста, смотрите обновленный ответ. – strelok2010

+0

Работает обновленный ответ. Огромное спасибо. Итак, в основном функция «смотреть» просто «ждет» для заполнения данных? Мне жаль, что я спрашиваю, но я относительно новичок в угловой, и я просто стараюсь учиться так быстро, как могу. –

Смежные вопросы