Angular ui-router:有没有办法设置模板加载超时?

时间:2015-08-11 00:58:25

标签: angularjs

有没有办法设置默认"超时"对于模板加载?

我的模板说"待定"一分钟后(Chrome>网络标签)。这是一个间歇性的问题......每隔一段时间,模板就会花费无限的时间来加载。

我希望能够处理错误而不是无限期地等待我的页面加载。

1 个答案:

答案 0 :(得分:2)

没有明显的方法可以做到这一点。当您提供templateUrl时,发出的$http请求没有timeout属性。要取消,您需要进行自己的$http来电。

这可以使用templateProvider属性。您可以将此功能包装在服务中,以减少其混乱:

.factory("viewTemplateSvc", function($http, $templateCache){
  return {
    get: function(url, timeout){
      return $http
        .get(url, { 
              cache: $templateCache, 
              headers: { Accept: 'text/html' },
              timeout: timeout // timeout in milliseconds
            })
        .then(function(response) { 
          return response.data; 
        });                  {
    }
  }
})
.config(function($stateProvider){
  $stateProvider
     .state("stateA",
              {
                templateProvider: function(viewTemplateSvc){
                  return viewTemplateSvc.get("views/stateA.html", 2000);
                },
                // etc...
              });

})

这当然是相当混乱而且不是很干。当然,您可以依赖某些默认超时,但您需要为每个州指定templateProvider

避免这种情况的一种方法是使用$stateProvider.decorator并用templateUrl替换templateProvider的每次出现:

$stateProvider.decorator("views", function(state, viewsFn){
  var views = viewsFn(state);
  angular.forEach(views, function(config, name){
    if (config.templateUrl){
      var url = config.templateUrl;
      config.templateUrl = undefined;

      config.templateProvider = function(viewTemplateSvc){
         return viewTemplateSvc.get(url, 2000);
      }
    }
  });
  return views;
});

然后,您可以像以前一样继续使用templateUrl