-1

如何使用控制器访问从服务返回的值。在我的代码 service.js 函数showInfo()返回 JSON 对象。但是我不能在这个函数之外访问这些对象。如果我尝试从 controller.js 执行 console.log

console.log(chartService.showInfo.new_data)

我明白了

错误无法读取未定义的属性“new_data”

如果我尝试,也会发生同样的情况

console.log(chartService.showInfo)

我得到undefined

如何从控制器访问函数 showInfo 内的 JSON 对象 new_data?

服务.js

angular.module('myApp')
   .service('chartService', function (){
  return {
     getUrl: function init(path) {
        Tabletop.init( { key: path,
                         callback: showInfo,
                         simpleSheet: true } )
     }
  }

     function showInfo(data, tabletop){

          var new_data = JSON.stringify(data.map(function(el) {
            return {
                "name": el[Object.keys(el)[0]],
                "y": +el[Object.keys(el)[1]]
            };
     }));
   }
})

控制器.js

angular.module('myApp')    
      .controller('piechartCtrl', [ '$scope', 'chartService',  function (chartService, $scope) {
        console.log(chartService.showInfo.new_data)
    
    }]);
4

3 回答 3

1

最好的方法是使用 Promise。在 Angular 中,您将 q 框架作为 $q service $q docs

服务

angular.module('myApp')
  .service('chartService', function($q) {
    var deferredSpreadsheet = $q.defer();
    return {
      getSpreadsheet: function init(path) {

        Tabletop.init({
          key: path,
          callback: showInfo,
          simpleSheet: true
        });
        return deferredSpreadsheet.promise;

      },

    }

    function showInfo(data, tabletop) {

      data = JSON.stringify(data.map(function(el) {
        return {
          "name": el[Object.keys(el)[0]],
          "y": el[Object.keys(el)[1]]
        };
      }));
      deferredSpreadsheet.resolve(data);

    }
  })

控制器

angular.module('myApp')
.controller('piechartCtrl', ['$scope', 'chartService', function($scope, chartService) {

    var path = "https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0AmYzu_s7QHsmdDNZUzRlYldnWTZCLXdrMXlYQzVxSFE&output=html";
    var pro = chartService.getSpreadsheet(path).then(function(data) {
      console.log(data)

    })


  }]);

这里的工作示例

于 2016-01-14T14:00:38.830 回答
1

服务

angular.module('myApp').service('chartService', function (){
    return {
        init: init,
        showInfo: showInfo
    };

    function init(path) {
        return Tabletop.init({
            key: path,
            callback: showInfo,
            simpleSheet: true 
        });
    }

    function showInfo(data, tabletop){
        return JSON.stringify(data.map(function(el) {
            return {
                "name": el[Object.keys(el)[0]],
                "y": +el[Object.keys(el)[1]]
            };
        }));
    }
});

控制器

angular.module('myApp').controller('piechartCtrl', [ '$scope', 'chartService',  function (chartService, $scope) {
    var tabletop = chartService.init(),
        chartInfo = chartService.showInfo(someData, tabletop);

    console.log(chartInfo);        
}]);

我不确切知道您对 showInfo 中的参数想要什么,但这应该可以让您朝着正确的方向前进。

于 2016-01-14T13:29:53.120 回答
-2

肮脏的方式:你可以使用广播和发射

在服务中:

$rootScope.$broadcast('myEvent', JSONSTUFF);

在控制器中:

$scope.$on("myEvent", function(e, json){
console.log(json);
});
于 2016-01-14T13:32:52.830 回答