Onyooo
Onyooo

Reputation: 105

Requiring service breaks resolve

Trying to access a service in the resolve:

angular
  .module('app', ['ui.router', 'templates'])
  .config(function($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state('home', {
        url: '/',
        templateUrl: 'app/views/home.html',
        controller: 'Home as home',
        resolve: {
          productIndex: function (ProductService) {
debugger;
            // return ProductService.getProductsIndex();
          }
        }
      });
    $urlRouterProvider.otherwise('/');
  });

When the code above is run, the debugger never hits and nothing comes-up in the console. When ProductService is removed as a parameter, the debugger hits, but clearly, the service can't be called. If possible I would also prefer to only make http calls from services.

I've been looking around for a while now, and only see working examples of similar injections. Even looking back at previous (working) projects, I can't see any difference with what was done above. My guess is that something might be wrong somewhere else. Any help would be great!

For the sake of completeness:

function ProductService($http) {
  this.getProductsIndex = function() {
    // debugger;
    // return $http.get('/products');
  };

}

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

Upvotes: 1

Views: 47

Answers (2)

rob
rob

Reputation: 18513

Right now your services is being registered as a controller. you should register it as a service instead. e.g.

angular
  .module('app')
  .service('ProductService', ProductService);

Upvotes: 1

Ankur Soni
Ankur Soni

Reputation: 746

var app = angular.module('*****')

app.service('ProductService', function() {
        return {
            getData: function($q, $http) {
                var defer = $q.defer();
                $http.get('****').success(function(data) {
                    defer.resolve(data);            
                });
                return defer.promise;
            }
        };
    });

abou resolves

resolve takes either the string of a service or a function returning a value to be injected

resolve: {
  productIndex: function (ProductService) {
   // your stuff goes here.
  }
}

this shouls work.. :)

Upvotes: 0

Related Questions