1

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

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

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

4

2 回答 2

1

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

  1. 构建一个服务,提供对其调用的类别的访问。我的想法是,该服务在第一次调用时会从服务器加载类别,然后缓存加载的数据,因此下次调用缓存副本时会提供缓存副本,以保存对服务器的请求。让我们暂时调用此服务categories
  2. 在加载用户请求的视图(以及相应的控制器)之前,使用 object 的resolve属性route确保对服务的依赖得到解决。categories因此,您可以将categories服务注入控制器并确保服务始终可用,因为它已被解析。

如果您以前从未resolve在配置路由时使用过该属性,这里是一个示例官方文档中讨论它的部分。我建议你通过它们。

此外,为了了解其resolve工作原理,您需要熟悉 promise 和 deferred 的概念。如果您不是,这里是该主题的一个很好的起点。$q是 AngularJS 的 promise/deferred 实现。

我无法评论上述方法是否是最佳实践,但我知道使用服务来提供对某些数据/函数的访问是一个很好的实践,比如是否存在全局变量。

于 2013-04-16T16:26:29.273 回答
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; 
于 2013-06-10T20:32:38.547 回答