2013-04-16 108 views
1

我想在Angular中「模擬」全局變量。我也希望能夠在App_Init()類型的處理程序中初始化這些「全局變量」。這樣的初始化將需要$ http調用來填充這些變量。我希望所有的「全局變量」在Angular「調用」控制器和視圖之前完全加載,因爲控制器將取決於初始化的數據。應用程序初始化處理程序等效於角?

什麼是在角的一些最佳做法?嵌套控制器?服務?

例如:管理在一家餐館的菜單項的應用程序。每個項目將與一個類別(飲料,開胃菜,甜點等)相關聯。我需要在Angular「甚至觸及」控制器和食物視圖之前首先加載所有這些類別。

回答

1

您是否使用ng-view,併爲您的應用程序的$routeProvider服務?假設您正在或將要考慮,您可以按照以下步驟順序執行以下操作:

  1. 構建一個服務,爲其調用的類別提供訪問權限。我的想法是,這個服務會在第一次調用服務器時加載服務器的類別,然後緩存加載的數據,因此下次它被稱爲緩存副本時,服務器會將請求保存到服務器。現在我們稱這個服務爲categories
  2. 使用route對象的resolve屬性可確保在加載用戶請求的視圖(和相應的控制器)之前解決對categories服務的依賴關係。因此,您可以將categories服務注入到控制器中,並確保服務始終可用,因爲它已被解決。

如果你從來沒有在之前配置路由與resolve性質的工作,這是an examplethe part of the official docs that talks about it。我建議你通過他們。

此外,爲了瞭解如何resolve的作品,你需要熟悉的承諾和遞延的概念。如果你不是,here是這個話題的一個很好的起點。 $q是AngularJS對promise/deferred的實現。

我不能發表評論,如果上述辦法是最好的做法,但我知道這是使用服務一樣,如果有全局變量來提供訪問一些數據/功能的一個很好的做法。

0

您可以創建一個服務加載從服務器的配置,並把它放在rootScope,在你的控制器,你可以調用你的函數這個服務,這個功能你NG-INIT在你看來調用。

查看

<mytag ng-init="myFunc()"> 

控制器

module.controller('MyCtrl', function($scope, myService){ 
    $scope.myFunc = function(){ 
     myService(); 
    } 
} 

服務(初始化程序)

module.service('myService', function($http, $rootScope){ 
    //do something 
    $rootScope.config = configLoaded; 
} 

另一個提示

如果你是在與異步調用,您可以嘗試麻煩至 使用

var deferred = $q.defer(); 

//when your call come back 
deferred.resolve(yourData); 

//and in the last line of function 
deferred.promise;