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;