2013-04-01 36 views
16

我想在第一次啓動我的AngularJS應用程序或每次刷新頁面時都有一個「全局函數」。

此功能將調用我的服務器$http.get()獲取使用我的應用程序所需的全局信息。我需要在這個函數中訪問$rootScope。之後,只有在這個請求完成後,我才使用app.config$routeProvider.when()加載良好的控制器。

app.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
     .when('/', 
     { 
      /**/ 
     }); 
}]); 

我不希望應用程序在此操作完成之前執行某些操作。所以我想我必須使用「解決方案」,但我真的不知道如何使用它。

任何想法?

謝謝!

+4

你*在運行'config'塊之前不能運行'$ http'請求。 'run'塊會立即*在'config'塊之後運行,這是你可以做到的最快的一點。另外,您不應該將數據存儲在'$ rootScope'中,而是存儲在一個服務中。爲什麼在設置路由之前你覺得你需要這些信息? –

+0

我正在嘗試創建一個國際網站,多種語言。 1.從服務器(Global function!)獲取翻譯並將這些數據放入rootScope(所有翻譯,以避免用戶在每次更換頁面時加載翻譯,並且避免列出每個我需要的關鍵字如果您有另一個想法來獲取模板中使用的關鍵字列表,然後在模板加載後加載翻譯,可能會幫助我) 2.設置路由 3.執行控制器,顯示。 – alexmngn

+1

翻譯應該在服務當中。如果你想要一些開箱即用的服務,比如[這個](https://github.com/PascalPrecht/ng-translate),那裏就有服務 - 如果沒有別的東西,它應該提供靈感。但是在設置路由之前,您仍然沒有回答爲什麼需要翻譯。 –

回答

23

這不是解決您給定問題的最佳方法,但這裏提供了針對您的問題的建議解決方案。

run(...)中的任何內容都將在初始化時運行。

angular.module('fooApp').run(['$http', '$rootScope' function($http, $rootScope) { 
$http.get(...).success(function(response) { 
    $rootScope.somedata = response; 
}); 

$rootScope.globalFn = function() { 
    alert('This function is available in all scopes, and views'); 
} 

}]); 

現在的警報可以在所有的觀點被觸發,使用ng-click="globalFn()"

注意,使用了新的分離範圍的指令將無法訪問這些數據,如果沒有明確繼承:$scope.inheritedGlobalFn = $rootScope.globalFn

+0

這並不能解決問題。在返回運行異步調用之前,任何需要某些數據的視圖都很可能需要該數據,從而導致錯誤。問題在於無法等待運行中發生的事情。 AngularJS需要的是一個普遍的決心。這目前不存在,我還沒有找到一個乾淨的解決方案來解決這個問題。 –

+0

確實。如果所有的控制器都有一個注入服務,並且在Run中觸發了諾言,它將解決問題。稍後將花時間提供一個體面的例子! –

+0

''$ rootScope''&'函數($ http,';)之間缺少一個逗號不能編輯,因爲我需要更多的字符(錯字編輯顯然不需要在SO上) – z3ntu

3

至於您的解決方案的第一步,我認爲你可以監視$ routeChangeStart事件在每次更改路由之前觸發(或者在您的案例中刷新頁面)。

var app = angular.module('myApp').run(['$rootScope', function($rootScope) { 
    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     if (!$rootScope.myBooleanProperty)) { 
      $location.path('/'); 
     } 
     else { 
      $location.path('/page'); 
     } 
    }); 
}); 

你應該有一個單頁應用看看this article有關身份認證。我認爲你可以做類似的工作。