2014-03-26 41 views
0

我可以以某種方式在.run方法中保存應用程序的引導程序嗎?Angularjs:暫停引導直到資源加載

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

動機:

我控制器預計某些共享的應用程序數據存在。

當我的用戶登錄時,我可以確保在將它們從登錄控制器發送到應用程序之前加載所有共享數據。

但是,當用戶返回的身份驗證Cookie已經存在,並且想要轉到由AdminCtrl控制的/admin時,我想阻止加載控制器/頁面,直到加載共享應用程序數據。

回答

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

...不是最美麗的方式,但它的工作原理:)

0

可以延遲,如果你發現了餅乾,但你必須做服務器端,並注入這樣的啓動角:

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

您隨時可以解僱這一點,我會它延遲到您的共享數據準備就緒。下面是它的鏈接:http://docs.angularjs.org/api/ng/function/angular.bootstrap

+0

我已經使用這種技術來加載一些非角資源(模型中,也與Node.js的服務器共享的純JS)。在這種情況下,延遲引導是非常有意義的,因爲我想要加載的資源是「超出」角度的。但這不是這個問題的情況。 – Cotten