下次调用API端点时将覆盖工厂/服务数据

时间:2016-03-18 06:35:56

标签: angularjs angularjs-scope angularjs-service angularjs-factory

我在使用工厂或服务端点在单个页面上填充2个highcharts图表以自动获取数据时遇到问题。我设置了一个工作正常的指令,我可以看到绑定的元素和2个图表出现,问题是工厂/服务用最后一个被调用的api的一组新数据覆盖他们以前的数据。所以我可以看到2个图表,但只有1个图表被正确绘制,另一个是空白的,因为它获得了空白数据(或相同的数据)。我有单独的控制器,我不知道为什么这个工厂/服务从一个到另一个流血。

控制器:

.controller('getSalesByDay', ['$scope', 'liveStats', function($scope, liveStats){

    var promise = liveStats.getLiveStats({api_path: 'salebydayorhour'});
    promise.then(function (saledata){
        $scope.saleData = saledata.data.count
        $scope.axisInfo = {
            categories: saledata.data.date
        }
    })

}])

.controller('getForeCastByDay', ['$scope', 'getForeCastByDay', function($scope, getForeCastByDay) {



    $scope.getForecastByDay = getForecastByDay.query({api_path: 'getforecastdata'})
        .$promise.then(function (forecast) {

            $scope.forecastData = forecast.count;
            $scope.axisInfo = {
                categories: forecast.date
            }
        });
    }])

工厂/服务:

.service('liveStats', ['$http', '$q', function($http, $q){

    var deferred = $q.defer();

    $http.get(API_PATH+'live_stats/salesbyday', {api_path: '@api_path'})
    .then(function (data){
        deferred.resolve(data);
    });

    this.getLiveStats = function () {
        return deferred.promise;
    }

}])

.factory('getLiveStats', ['$resource', function($resource) {

        return $resource(API_PATH+'live_stats/:api_path', {api_path: '@api_path'},
        {
            query: {
                isArray: false
            }
        }
    );

}])

模板:

<div ng-controller="getSalesByDay">
    <div ng-if="salesData">
        <datachart data="salesData" axis="axisInfo"></datachart>
    </div>
</div>

<div ng-controller="getForecastByDay">
    <div ng-if="forecastData">
        <datachart "data="forecastData" axis="axisInfo"></datachart>
    </div>
    </div>

我试过传递承诺和推迟方法,我试过。然后,我似乎无法找到如何命中一个特定的端点(比如我在我的工厂得到它,因为它是用api_path配置定制的)和请求2个json blob数据在一个页面上填充2个独立的图形。

任何帮助都会很棒,现在已经坚持了一段时间,搜索的范围很广,但我觉得我错过了一些关键。

注意:我更改了范围/控制器名称,因为这是一个私人项目,我不希望发布的名称(如果有人发现拼写错误或变量不匹配,所有代码在这一方面工作正常)。

1 个答案:

答案 0 :(得分:1)

$http服务返回一个承诺。无需使用$q创建一个。

工厂/服务:

.service('liveStats', ['$http', '$q', function($http, $q){
    this.getLiveStats = function (config) {
        return $http.get(API_PATH+'live_stats/salesbyday',config);
    }
}])