Angularjs:暂停引导直到加载资源

时间:2014-03-26 11:51:03

标签: angularjs

我能以某种方式在.run方法中持有应用程序的引导程序吗?

angular.module('myApp', [...])
  .config(
    ...
  )
  .run(function(AppService) {
    pauseLoadingRestOfApp();             // 1
    AppService.loadSharedDataAsnyc()
      .then(function() {
        continueLoadingRestOfApp();      // 2
      });
  }) 

动机:

我的控制器希望存在某些共享应用程序数据。

当我的用户登录时,我可以确保在将所有共享数据从登录控制器发送到应用程序之前加载它们。

但是,当用户返回已经存在的身份验证cookie并希望转到由/admin控制的AdminCtrl时,我想暂停加载控制器/页面,直到共享的应用数据已加载。

2 个答案:

答案 0 :(得分:0)

如果你检测到cookie,你可以延迟启动角度,虽然你必须在服务器端执行并注入这样的东西:

angular.bootstrap(document, ["myApp"]);

您可以随时触发此功能,我会将其延迟,直到您的共享数据准备就绪。以下是其中的链接:http://docs.angularjs.org/api/ng/function/angular.bootstrap

答案 1 :(得分:0)

我以为会有很多角色大师想要回答这个问题,但是没有......:)

所以,我有点讨厌的解决方案是:

app.js中的

if(needsToLoadAppData) {
  $rootScope.isLoading = true;

  AppManager.loadAppData()
    .then(function() {
      $rootScope.isLoading = false;
      $rootScope.$broadcast('appDataLoaded');
    });
}

在我的“主要” - 控制器中:

var init = function() {
  if($rootScope.isLoading) {
    $rootScope.$on('appDataLoaded', function() { initData(); });
  }
  else {
    initData();
  }
  // ... init stuff that's not in need of "appData"
};

var initData = funciton() {
  // .. init stuff in need of "appData"
};

请注意,您只需在控制器中使用$scope代替$rootScope

......不是最美丽的方式,但它有效:)