如何将来自同一服务的数据加载到AngularJS中的两个不同范围变量?

时间:2015-10-28 16:25:17

标签: javascript angularjs angularjs-scope

我有这个应用程序,我正在为此创建一个检索给定月份数据的服务。在这个MeasurementController中,我必须加载两个月的数据,当前和之前。我在将数据加载到两个单独的变量时遇到了一些问题。

monthlyReportApp.controller('MeasurementController',['$scope', 'phoneReportService', function ($scope, phoneReportService) {

    var currentMonth = 9;
    var prevMonth = 8;
    var phoneReport = {};

    $scope.currentMonth = {};
    $scope.prevMonth = {};



    $scope.currentMonth = monthlyReport(prevMonth);

    function applyPhoneReport(report) {
        //phoneReport = {};
        phoneReport = report[0];
    }

    console.log($scope.currentMonth);
    console.log($scope.prevMonth);

    function monthlyReport(month) {
        loadPhoneReport(month);
        console.log(phoneReport);
        return phoneReport;
    }

    function loadPhoneReport(month) {
        phoneReportService.getReport(month)
                    .then(function (report) {
                        applyPhoneReport(report);
                    });
    }



}]);

如您所见,loadPhoneReport从服务中调用getReport方法。 applyPhoneReport方法将数据复制到数组。现在,如果只有一个$ scope对象,那么我可以将applyPhoneReport方法直接复制到它上面,但是因为我有两个不同的"月"我需要的数据,我无法弄清楚如何复制它而不重复相同的功能来做同样的事情。实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这是您的控制器在controllerAs语法中重构,只调用一次服务器。

您可以在此处阅读角度最佳实践(在控制器顶部声明控制器变量,使用控制器等):

https://github.com/johnpapa/angular-styleguide

(function(){
    "use strict";

    angular
        .module('app')
        .controller('MeasurementController', MeasurementController);

    MeasurementController.$inject = ['$scope', 'phoneReportService'];

    /* @ngInject */
    function MeasurementController ($scope, phoneReportService) {
        /* jshint validthis: true */
        var vm = this;

        vm.currentMonth = {};
        vm.prevMonth = {};

        var currentMonth = 9;
        var prevMonth = 8;
        var phoneReport = {};

        activate();

        ////////////////

        function activate() {
            loadPhoneReport(prevMonth, vm.prevMonth);
            loadPhoneReport(currentMonth , vm.currentMonth );
        }

        function loadPhoneReport(month, reportRef) {
            return phoneReportService.getReport(month)
            .then(function(report){
                if (reportRef )
                    reportRef = report[0];
                return report[0];
            });
        }

    }
})();