Using the ngRoute 'resolve' parameter with an injected promise

Problem

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?

Problem courtesy of: AlexFoxGill

Solution

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;
    };
}])
Solution courtesy of: Ye Liu

Discussion

There is currently no discussion for this recipe.

This recipe can be found in it's original form on Stack Over Flow.