我正在使用AngularJS 1.3和UI-Router。我有一个决心和templateProvider的状态。

我想要完成的是templateProvider可以使用解析中从数据库检索到的信息。现在,我必须两次获取信息,一次是来自resolve,另一次是来自templateProvider,这很烦人。

编码:

        .state('articleurl', {
          url: '/:articleUrl',
          resolve: {
            article: function ($http, $stateParams, $location) {

              return $http({
                method: 'GET',
                url: '/articles/' + $stateParams.articleUrl
              })
              .then(function (article) {

                  return article;

              }, function (error) {

                $location.path('/404');

              });
            },
            loggedin: checkLoggedin
          },
          templateProvider: ['$templateFactory', '$stateParams', '$http', function ($templateFactory, $stateParams, $http) {
            return $http({
                method: 'GET',
                url: '/articles/' + $stateParams.articleUrl
              }).then(function(article) {

                if ( article.data.template )
                  return $templateFactory.fromUrl('articles/views/templates/' + article.data.template + '.html');
                else
                  return $templateFactory.fromUrl('articles/views/templates/news.html');
            });
          }],
          controller: 'ArticlesViewController'
        })


如您所见,根据文章的种类,我在templateProvider中加载了另一个模板。此外,我在控制器中使用了该文章的信息,该信息先前已由该州解决。

有没有办法在templateProvider中使用以前在解析中获取的信息,从而避免通过这种方式再次调用数据库?

现在,每个连接正在对数据库进行2次调用。

谢谢!

最佳答案

app.factory('article', function ($cacheFactory){
  var articleCache = $cacheFactory('article');

  return function (url) {
    return articleCache.get(url) || articleCache.put(url, $http({
        method: 'GET',
        url: '/articles/' + url
      })
    );
  };
});


在两个地方都将其用作article($stateParams.articleUrl).then(...),这会使东西保持干燥。通过将$cacheFactory替换为angular-cache,可以更好地控制缓存(例如过期)。

$http own caching也可以成功使用,而不是显式缓存:


  如果对同一URL有多个GET请求,
  使用相同的缓存进行缓存,但尚未填充缓存
  将向服务器发出一个请求,其余请求将
  使用第一个请求的响应来实现。

关于javascript - 将先前检索到的信息传递给AngularJS中的templateProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32760834/

10-09 18:01