Using the ngRoute 'resolve' parameter with

2020-06-06 02:41发布

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?

1条回答
在下西门庆
2楼-- · 2020-06-06 03:15

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;
    };
}])
查看更多
登录 后发表回答