Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the ngRoute 'resolve' parameter with an injected promise

I have configured the resolve parameter of several routes to return a promise in order to delay instantiation of the controller until the promise is resolved. Currently I am using the function notation, rather than specifying a string to inject.

For example:

.when('/article/:id', {
    templateUrl: 'app/article/article.html',
    controller: 'ArticleController',
    resolve: {
        article: ['Content', '$route', function (Content, $route) {
            return Content.get({ contentId: $route.current.params.id }).$promise;
        }]
    }
})

The article parameter is correctly injected with the resolved promise value.

However, I would like to keep it DRY and inject this value by specifying a string, as is mentioned in the documentation.

When I set up a factory function to provide the promise like so, the instance is only injected correctly once (the first time). Thereafter, the same promise is used because the AngularJS injection service has cached the instance.

.factory('contentPromise', ['Content', '$route', function (Content, $route) {
    return Content.get({ contentId: $route.current.params.id }).$promise;
}])

Is it possible to specify that the factory function must be run every time it is requested? Or to achieve my goal in some other way?

like image 888
Alex Avatar asked Mar 20 '23 14:03

Alex


1 Answers

The first example you have is the way to go, I think you could go a little bit "DRYer" like this:

.when('/article/:id', {
    ...
    resolve: {
        article: ['contentPromise', function (contentPromise) {
            return contentPromise();
        }]
    }
})

Service:

.factory('contentPromise', ['Content', '$route', function (Content, $route) {
    return function() {
        return Content.get({ contentId: $route.current.params.id }).$promise;
    };
}])
like image 119
Ye Liu Avatar answered Apr 01 '23 16:04

Ye Liu