我想在Angular中“模拟”全局变量。我还希望能够在App_Init()类型的处理程序中初始化那些“全局变量”。这样的初始化将需要$ http调用来填充这些变量。我希望在Angular“调用”控制器和视图之前完全加载所有“全局变量”,因为控制器将依赖于初始化的数据。
Angular有哪些最佳实践?嵌套控制器?服务?
示例:管理餐厅菜单中项目的应用程序。每个项目将与一个类别(饮料,开胃菜,甜点等)相关联。我需要首先加载所有这些类别,然后Angular“甚至触摸”食品的控制器和视图。
答案 0 :(得分:1)
您是否在为自己的应用使用ng-view
和$routeProvider
服务?假设您正在或将要考虑,您可以按步骤顺序执行此操作:
categories
。resolve
对象的route
属性确保在加载用户请求的视图(以及相应的控制器)之前解析了对categories
服务的依赖性。因此,您可以将categories
服务注入控制器,并确保服务始终可用,因为它已经解决。如果您之前从未使用resolve
属性配置路由,则此处为an example和the part of the official docs that talks about it。我建议你仔细阅读。
另外,为了理解resolve
的工作原理,您需要熟悉promise和deferred的概念。如果不是,here是该主题的一个很好的起点。 $q是AngularJS对promise / deferred的实现。
我不能评论上述方法是否是最佳实践,但我知道使用服务来提供对某些数据/函数的访问是一种很好的做法,例如,如果存在全局变量。
答案 1 :(得分: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;