【问题标题】:Service injection in config. AngularJS配置中的服务注入。 AngularJS
【发布时间】:2017-08-07 14:19:47
【问题描述】:

我有这项服务:

app.service("UserService", function(){

    var userService = {};
    userService.userInfo = [
        {firstName: "John", lastName: "Doe"},
        {firstName: "Carl", lastName: "Smith"}
        ];
    return userService;
});

我想将它注入 .config 以定义路由(我正在使用 ui-router)

app.config(["userService", function($stateProvider, userService){
     $stateProvider
    .state("#",{
        templateUrl: "index.html",
        controller: "UserListController"
    })
    .state('users', {
        url: '/user/:username',
         templateUrl: "view/userProfile.html",
        controller: "UserListController",
         params: { username: userService.userInfo[0].firstName}
           })
...

这不能正常工作。关于我可以在该服务中注入数据以供 .config 访问的任何想法吗?

谢谢你:)

【问题讨论】:

  • 也许这只是您的问题中的拼写错误,但是您的服务名称以大写开头,但是当您包含它时,您忘记了这个大写
  • 不,我认为这不是问题。问题是它似乎无法访问参数中的 userService.userInfo[0].firstName。如果我只是将其更改为字符串,它就可以正常工作

标签: angularjs parameters angular-ui-router config inject


【解决方案1】:

在配置期间,您只能访问提供程序,在您的情况下,您可以通过将其注入您的 app.config 来访问 UserServiceProvider,如下所示:

app.config(function(UserServiceProvider){
    // Config stuffs...
})

使用此提供程序,您可以使用 $get() 访问您的服务属性,例如:

UserServiceProvider.$get().userInfo[0]

Here 是一个工作中的笨蛋

【讨论】:

  • 但是我怎样才能访问 .config 中的数据以获取路由?主要目标是网址将根据用户名
  • @N.Car 您需要将params: { username: userService.userInfo[0].firstName} 替换为params:{username: UserServiceProvider.$get().userInfo[0].firstName} 并在配置声明中包含UserServiceProvider
  • 工作!!!非常感谢!所以基本上当你想在 .config 中注入一些东西时,你需要将其设为提供者,然后使用 $get() 以获得其中的内容?
  • 不是真的让它成为一个提供者,而是使用它的提供者,然后使用 $get()。但我认为这不是使用提供程序和 $get() 的正确方法。
【解决方案2】:

对于 AngularJS 中的注入,如果要给出要注入的名称,则需要给出所有名称并以与声明它相同的方式。

在这种情况下:

app.config(["$stateProvider", "UserService", function($stateProvider, userService){

【讨论】:

  • 我刚刚添加了它,但它仍然无法正常工作。我认为他没有将此 userService.userInfo[0].firstName 识别为字符串。如果我将其更改为 {username: "click me"} 它工作得很好
  • 不,实际上当我按照您所说的那样接收 userService 时它不起作用。 { app.config(["$stateProvider", "userService", function($stateProvider, userService){ $stateProvider .state("#",{ templateUrl: "index.html", controller: "UserListController" }) .state ('users', { url: '/user/:username', templateUrl: "view/userProfile.html", controller: "UserListController", params: { username: "click me"} }
【解决方案3】:

常量在配置阶段和运行阶段都是可注入的:

app.constant("UserConstant", {
    userInfo:[
        {firstName: "John", lastName: "Doe"},
        {firstName: "Carl", lastName: "Smith"}
    ]
});

来自文档:

常量(名称,值);

$injector 注册一个常量服务,例如字符串、数字、数组、对象或函数。和value一样,不能将其他服务注入到常量中。

但与value 不同的是,常量可以注入到模块配置函数中(参见angular.Module)并且不能被AngularJS decorator 覆盖。

Angular $provider API Reference - constant

【讨论】:

  • 谢谢!!它也有效!我还在学习 AngularJS 并且不知道常量。一定会调查的:)
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2014-06-14
  • 2016-11-02
  • 2015-02-27
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多