首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在app.config中注入服务

在app.config中注入服务
EN

Stack Overflow用户
提问于 2013-04-11 06:02:01
回答 9查看 129.8K关注 0票数 169

我想向app.config注入一个服务,这样就可以在调用控制器之前检索数据。我是这样尝试的:

服务:

代码语言:javascript
复制
app.service('dbService', function() {
    return {
        getData: function($q, $http) {
            var defer = $q.defer();
            $http.get('db.php/score/getData').success(function(data) {
                defer.resolve(data);            
            });
            return defer.promise;
        }
    };
});

配置:

代码语言:javascript
复制
app.config(function ($routeProvider, dbService) {
    $routeProvider
        .when('/',
        {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                data: dbService.getData(),
            }
        })
});

但是我得到了这个错误:

错误:未知提供程序:来自EditorApp的dbService

如何正确设置和注入此服务?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-04-11 07:12:11

Alex提供了不能做你想做的事情的正确原因,所以+1。但是你遇到了这个问题,因为你没有很好地使用它们是如何设计的。

resolve接受服务的字符串或返回要注入的值的函数。由于执行的是后者,因此需要传入一个实际的函数:

代码语言:javascript
复制
resolve: {
  data: function (dbService) {
    return dbService.getData();
  }
}

当框架解析data时,它会将dbService注入到函数中,以便您可以自由使用它。您根本不需要注入到config块中就可以做到这一点。

祝你开胃愉快!

票数 131
EN

Stack Overflow用户

发布于 2014-02-09 02:50:49

将您的服务设置为自定义AngularJS提供程序

不管公认的答案是什么,您实际上可以做您想做的事情,但您需要将其设置为可配置的提供者,以便它在配置阶段作为服务可用。首先,将您的Service更改为提供者,如下所示。这里的关键区别在于,在设置defer的值之后,将defer.promise属性设置为由$http.get返回的promise对象

提供者服务:(提供者:服务配方)

代码语言:javascript
复制
app.provider('dbService', function dbServiceProvider() {

  //the provider recipe for services require you specify a $get function
  this.$get= ['dbhost',function dbServiceFactory(dbhost){
     // return the factory as a provider
     // that is available during the configuration phase
     return new DbService(dbhost);  
  }]

});

function DbService(dbhost){
    var status;

    this.setUrl = function(url){
        dbhost = url;
    }

    this.getData = function($http) {
        return $http.get(dbhost+'db.php/score/getData')
            .success(function(data){
                 // handle any special stuff here, I would suggest the following:
                 status = 'ok';
                 status.data = data;
             })
             .error(function(message){
                 status = 'error';
                 status.message = message;
             })
             .then(function(){
                 // now we return an object with data or information about error 
                 // for special handling inside your application configuration
                 return status;
             })
    }    
}

现在,您有了一个可配置的自定义提供程序,您只需注入它。这里的关键区别在于缺少“可注入的提供者”。

配置:

代码语言:javascript
复制
app.config(function ($routeProvider) { 
    $routeProvider
        .when('/', {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                dbData: function(DbService, $http) {
                     /*
                     *dbServiceProvider returns a dbService instance to your app whenever
                     * needed, and this instance is setup internally with a promise, 
                     * so you don't need to worry about $q and all that
                     */
                    return DbService('http://dbhost.com').getData();
                }
            }
        })
});

appCtrl中使用已解析的数据

代码语言:javascript
复制
app.controller('appCtrl',function(dbData, DbService){
     $scope.dbData = dbData;

     // You can also create and use another instance of the dbService here...
     // to do whatever you programmed it to do, by adding functions inside the 
     // constructor DbService(), the following assumes you added 
     // a rmUser(userObj) function in the factory
     $scope.removeDbUser = function(user){
         DbService.rmUser(user);
     }

})

可能的替代方案

下面的替代方法是类似的方法,但允许在.config中进行定义,将服务封装到应用程序上下文中的特定模块中。选择适合你的方法。也可以查看下面关于第三个备选方案的注释和有用的链接,帮助您掌握所有这些事情的诀窍

代码语言:javascript
复制
app.config(function($routeProvider, $provide) {
    $provide.service('dbService',function(){})
    //set up your service inside the module's config.

    $routeProvider
        .when('/', {
            templateUrl: "partials/editor.html",
            controller: "AppCtrl",
            resolve: {
                data: 
            }
        })
});

一些有用的资源

  • John Lindquist在egghead.io上有一个精彩的5分钟解释和演示,这是一个免费的课程!我基本上修改了他的演示,使其在此请求的上下文中特定于$http
  • 查看Providers
  • There上的AngularJS开发人员指南也是对also的极好解释

提供程序为您提供了比.service方法更多的配置,这使得它更适合作为应用程序级别的提供程序,但您也可以通过将$provide注入到配置中来将其封装在配置对象本身中,如下所示:

票数 140
EN

Stack Overflow用户

发布于 2013-04-11 06:40:52

简而言之:不能。AngularJS不允许您将服务注入到配置中,因为它不能确保它们已正确加载。

查看这个问题和答案:AngularJS dependency injection of value inside of module.config

模块是在引导过程中应用于应用程序的配置和运行块的集合。在其最简单的形式中,模块由两种类型的块的集合组成:

配置阻止在提供者注册和配置阶段执行- get。只有提供程序和常量才能注入到配置块中。这是为了防止服务在完全配置之前意外实例化。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15937267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档