如何从模块实例中获取服务实例 [Angular]
如何从模块实例中获取服务实例 [Angular]
我定义了一些模块和相关的服务,如下所示:\n
var services = angular.module('app.services', []); services.factory('ApiService', function($http,$cookies,UserService){ var dataFactory = {}; dataFactory.request=function(url,data,next){ return "Hi"; }; return dataFactory; });
\n现在在另一个脚本中,我可以访问该模块,如下所示:\n
services = angular.module('app.services')
\n但是,我如何从该模块中获取服务实例呢?像下面这样:\n
apiService = angular.module('app.services').service('ApiService')
问题背景:在这个问题中,提问者想要在Angular应用程序初始化之前检查某些条件,并根据条件决定是否允许应用程序运行。他想要使用自己编写的ApiService工厂中的代码来实现这一点。
解决方法:为了实现这个目的,提问者可以使用Angular的app.run函数,该函数在控制器之前调用,并且可以使用$window.location.href将用户重定向到另一个页面或站点(如果不允许)。
在app.js中,可以使用以下代码将app.run函数添加到应用程序中:
var app = angular.module('app', ['app.services']); app.run(function(ApiService, $window) { result = ApiService.request(); // This is where you check your permissions var has_permissions = false; // ... if (!has_permissions) { alert('being transferred to plnkr.co due to lack of permissions'); $window.location.href = 'http://plnkr.co/'; } // Otherwise, continue normally });
这样做之后,当应用程序启动时,将会调用ApiService.request()函数,并在检查权限后决定是否允许应用程序继续运行。
原始解决方案:在原始的问题中,提问者将所有逻辑分离到了名为api.services的模块中,并在应用程序中引用了该模块。然后,他可以在控制器中通过引用所需的工厂(ApiService)来使用该模块。
以下是他的代码示例:
var app = angular.module('app', ['app.services']); app.controller('myCtrl', ['$scope', 'ApiService', function($scope, ApiService) { $scope.result = ApiService.request(); } ]); var services = angular.module('app.services', []); services.factory('UserService', function() { var UserService = {}; UserService.foo = function() { return "foo"; }; return UserService; }); services.factory('ApiService', function($http, UserService) { var ApiService = {}; ApiService.request = function(url, data, next) { return UserService.foo() + " Hi"; }; return ApiService; });
通过这种方式,可以在控制器中使用ApiService,并调用ApiService.request()函数来获取服务实例。
通过在应用程序启动前使用app.run函数,并在其中检查权限,可以实现在Angular应用程序初始化之前决定是否允许应用程序运行的功能。通过将逻辑分离到单独的服务模块中,并在控制器中引用该模块,可以实现获取服务实例的需求。