在承诺解决后加载ui路由器模板

时间:2016-07-26 09:00:46

标签: angularjs angular-ui-router

我希望获得如下的本地化模板:

  • '/templates/en/main/index'
  • '/templates/fr/main/index'

所以每次我有一个templateUrl,我将它包装在一个函数中,该函数依赖于带有类似的语言环境的全局变量:

templateUrl: function(){ return localizePath('/templates/main/index'); }
// returns '/templates/locale/main/index' depending on he locale

我必须通过ajax调用检索语言环境,所以我显然需要暂停状态激活。我尝试了以下但它并没有阻止路由器尝试获取模板:

var initialized = false;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams) {
  if (!initialized) {
    event.preventDefault();
    return sessionSvc.getLocale.then(function() {
      initialized = true;
      $state.go(toState, toParams);
    });
  }
});

然后路由器尝试在以下路径获取模板:'/templates/undefined/main/index'

如何在尝试获取模板之前让ui-router等待?

1 个答案:

答案 0 :(得分:3)

templateUrl函数不能以异步方式工作,但您可以使用返回已解析模板的templateProvider函数并通过{{1}等待此调用来执行此操作属性。如果您只需要这一次,最好的方法是在根状态下定义您的解析并通过服务缓存结果值。

有关如何实施该问题的详细信息,请参阅此答案:ui-router: async data in templateUrl function