Search code examples
javascriptangularjsng-view

AngularJS App: Load data from JSON once and use it in several controllers


I'm working on a mobile app using AngularJS as a framework, currently I have a structure similar to this:

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl : 'pages/home.html',
            controller  : 'homeCtrl'
        })

        .when('/one', {
            templateUrl : 'pages/one.html',
            controller  : 'oneCtrl'
        })

        .when('/two', {
            templateUrl : 'pages/two.html',
            controller  : 'twoCtrl'
        });
}]);

app.controller('homeCtrl', ['$scope', function($scope) {

}]);

app.controller('oneCtrl', ['$scope', function($scope) {

}]);

app.controller('twoCtrl', ['$scope', function($scope) {

}]);

And then I'm displaying the content with an ng-view:

<div class="ng-view></div>

Things are working well but I need to load data from a JSON file to populate all the content of the app. What I want is to make and an AJAX call only once and then pass the data through all my different controllers. In my first attempt, I thought to create a Service with an $http.get() inside of it and include that in every controller, but it does not work because it makes a different ajax request everytime I inject and use the service. Since I'm new using angular I'm wondering what is the best way or the more "angular way" to achieve this without messing it up.

Edit: I'm adding the code of the service, which is just a simple $http.get request:

app.service('Data', ['$http', function($http) {
    this.get = function() {
        $http.get('data.json')
        .success(function(result) {
            return result;
        })
    }
});

Solution

  • Try this to get JSON Data from a GET Link:

    (function (app) {
        'use strict';
    
        app.factory('myService', MyService);
    
        MyService.$inject = ['$q', '$http'];
    
        function MyService($q, $http) {
            var data;
    
            var service = {
                getData: getData
            };
    
            return service;
    
            //////////////////////////////////////
    
            function getData(refresh) {
                if (refresh || !data) {
                    return $http.get('your_source').then(function(data){
                        this.data = data;
                        return data;
                    })
                }
                else {
                    var deferrer = $q.defer();
                    deferrer.resolve(data);
                    return deferrer.promise;
                }
            }
        }
    
    }(angular.module('app')));
    

    Now you can add this dependency in your controller file and use:

    myService.getData().then(function(data){
        //use data here 
    }, function(err){
        //Handle error here
    });