Angular Treemap с передачей данных из сервиса

0

На этой ссылке есть код treemap d3 -

http://jsfiddle.net/cyril123/h0q6xb45/1/

Теперь данные в этом статичны, т.е. В области в контроллере, но не загружаются нигде. Поэтому я закодировал один service-

app.service('grabdata', function($http){
var data = [];
$http.get('someApi').then(function success(response){
var company = [];
var wtdCagr = [];
var children = [];
for(var i=0;i<response.data.length;i++){
  company.push(response.data[i].companies);
  wtdCagr.push(response.data[i].wtdcagr);
  children.push({name:response.data[i].companies, value: 3241});
}
  data.push({name:"flare", children:children});
});
return {
getData: function(){
  return data[0];
   }
  };
});

и у меня есть контроллер up-

app.controller('myController', ['$scope', '$http','grabdata', function($scope, $http, grabdata) {
  $scope.$watch(grabdata.getData, function(change){
  $scope.data = change;
  }, true);
}]);

И я отредактировал директиву bit-

return {
  restrict: 'EA',
  scope: {data: '='},

  link: function(scope, elem, attrs) {
    scope.$watch(scope.data, function(newValue){
      console.log(newValue);
      var root = scope.data;

    });
   var root = scope.data;

Но я получаю эту ошибку на моем console-

TypeError: Cannot read property 'length' of undefined

Это означает, что данные не входят в директиву, что я делаю неправильно?

Теги:
d3.js
angularjs-directive

1 ответ

0

Хорошо, позвольте мне переписать несколько вещей для вас, чтобы вы могли попробовать и сообщить мне, все ли в порядке:

 //service    
 app.service('grabdata', function($http, $q){
  var data = [];
  return({
     getData:getData
  });

 function getData(){
   var defer = $q.defer();
   $http.get('someApi').then(function success(response){
   var company = [];
   var wtdCagr = [];
   var children = [];
   for(var i=0;i<response.data.length;i++){
     company.push(response.data[i].companies);
     wtdCagr.push(response.data[i].wtdcagr);
     children.push({name:response.data[i].companies, value: 3241});
   }
   data.push({name:"flare", children:children});
   defer.resolve(data[0]);
   return defer.promise;
 }
});



//controller
 app.controller('myController', ['$scope', '$http','grabdata', function($scope, $http, grabdata) {
    var $scope.data = [];
    grabdata.getData().then(function(response){
        $scope.data = response;
    });
    $scope.$watch($scope.data, function(newData,oldData){
       if(newData !== oldData){//workout some logic since this is array or object ??
           $scope.data = newData;
       }
    }, true);

 }]);

$ http service call is async, и вам нужно вернуть обещание стороне, которая заинтересована в данных, и когда обещание будет разрешено, вы получите свои данные. Я не понял, почему длина вашего объекта не определена, просто убедитесь, что присутствует response.data. Я бы посоветовал прочитать информацию об обработке данных async, ваша жизнь будет проще. Вы также можете вернуть $ http.get('/someapi') и обрабатывать данные в контроллере, если это так, как вы хотите это сделать

  • 0
    Теперь я получаю эту TypeError: Cannot read property 'then' of undefined указание на grabdata.getData().. function @vodich
  • 0
    Похоже, ваш сервис grabdata не найден. Убедитесь, что вы загрузили его
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню