应用程序初始化处理程序等效于Angular?

时间:2013-04-16 15:07:55

标签: model-view-controller angularjs controller initialization

我想在Angular中“模拟”全局变量。我还希望能够在App_Init()类型的处理程序中初始化那些“全局变量”。这样的初始化将需要$ http调用来填充这些变量。我希望在Angular“调用”控制器和视图之前完全加载所有“全局变量”,因为控制器将依赖于初始化的数据。

Angular有哪些最佳实践?嵌套控制器?服务?

示例:管理餐厅菜单中项目的应用程序。每个项目将与一个类别(饮料,开胃菜,甜点等)相关联。我需要首先加载所有这些类别,然后Angular“甚至触摸”食品的控制器和视图。

2 个答案:

答案 0 :(得分:1)

您是否在为自己的应用使用ng-view$routeProvider服务?假设您正在或将要考虑,您可以按步骤顺序执行此操作:

  1. 构建一个服务,为其调用的类别提供访问权限。我的想法是,这个服务会在第一次调用服务器时从服务器加载类别,然后缓存加载的数据,因此下次调用缓存副本时,会将服务请求保存到服务器。我们暂时将此服务称为categories
  2. 使用resolve对象的route属性确保在加载用户请求的视图(以及相应的控制器)之前解析了对categories服务的依赖性。因此,您可以将categories服务注入控制器,并确保服务始终可用,因为它已经解决。
  3. 如果您之前从未使用resolve属性配置路由,则此处为an examplethe 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;