-1

コントローラーを使用してサービスから返された値にアクセスするにはどうすればよいですか。私のコードでは、service.js 関数showInfo()が JSON オブジェクトを返します。しかし、この関数の外ではこれらのオブジェクトにアクセスできません。controller.js から console.log を実行しようとすると

console.log(chartService.showInfo.new_data)

私は得る

エラー undefined のプロパティ 'new_data' を読み取ることができません

しようとしても同じことが起こります

console.log(chartService.showInfo)

undefinedになります。

コントローラーから関数 showInfo 内の JSON オブジェクト new_data にアクセスするにはどうすればよいですか?

Service.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]]
            };
     }));
   }
})

Controller.js

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

3 に答える 3

1

最善の方法は、Promise を使用することです。angularでは、$ q service $ q docsとしてqフレームワークがあります

サービス

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 に答える