Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将以前检索到的信息传递给AngularJS中的templateProvider_Javascript_Angularjs_Node.js_Express - Fatal编程技术网

Javascript 将以前检索到的信息传递给AngularJS中的templateProvider

Javascript 将以前检索到的信息传递给AngularJS中的templateProvider,javascript,angularjs,node.js,express,Javascript,Angularjs,Node.js,Express,我正在使用AngularJS 1.3和UI路由器。我有一个状态,其中我有一个解析和一个模板提供程序 我试图实现的是,在解析中从数据库检索到的信息可以被templateProvider使用。现在,我必须获得两次信息,一次来自resolve,另一次来自templateProvider,这很烦人 守则: .state('articleurl', { url: '/:articleUrl', resolve: { artic

我正在使用AngularJS 1.3和UI路由器。我有一个状态,其中我有一个解析和一个模板提供程序

我试图实现的是,在解析中从数据库检索到的信息可以被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次调用


谢谢

我认为您可以直接注入已解析的变量,因此您可以在
templateProvider
中注入
article

   .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', 'article', function ($templateFactory, $stateParams, $http, article) {
        // Now here you can use article without the need to re-call it
      }],
      controller: 'ArticlesViewController'
    })
将其用作
文章($stateParams.articleUrl)。然后(…)
在这两个位置,这将保持物品干燥。通过将
$cacheFactory
替换为,您可以更好地控制缓存(例如过期)

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

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


可以使用
ng include
作为模板,将
src
从controllerI传递给它我试图避免这种方法,以便直接从state加载模板,但如果我无法解决此问题,很可能我将不得不使用这种方法。恐怕不行。我试着给它注射,但它不只是起作用…:(哦,是的,这很有魅力。现在它只向数据库发出一个请求=)谢谢!
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
      })
    );
  };
});