Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular 2依赖项注入-在某些组件中注入服务,但不是在所有组件中_Javascript_Angular_Typescript_Dependency Injection - Fatal编程技术网

Javascript Angular 2依赖项注入-在某些组件中注入服务,但不是在所有组件中

Javascript Angular 2依赖项注入-在某些组件中注入服务,但不是在所有组件中,javascript,angular,typescript,dependency-injection,Javascript,Angular,Typescript,Dependency Injection,我正在使用Angular 2应用程序,该应用程序只有一个模块,其中几个服务在bootstrap注册为提供者。应用程序在同一模块中还有几个组件正在使用这些服务 所有组件都使用DI接收服务(服务在Constructor中声明为参数) 我面临的问题是:在某些组件中正确地注入了相同的服务,但在其他组件中没有 我在Injector对象中检查了注入失败的组件,服务实例位于Injector对象中。它失败的是使用Injector.get()方法进行搜索。作为参数提供的令牌与喷油器字典中存储的令牌不同。我无法找出

我正在使用Angular 2应用程序,该应用程序只有一个模块,其中几个服务在bootstrap注册为提供者。应用程序在同一模块中还有几个组件正在使用这些服务

所有组件都使用DI接收服务(服务在Constructor中声明为参数)

我面临的问题是:在某些组件中正确地注入了相同的服务,但在其他组件中没有

我在Injector对象中检查了注入失败的组件,服务实例位于Injector对象中。它失败的是使用Injector.get()方法进行搜索。作为参数提供的令牌与喷油器字典中存储的令牌不同。我无法找出原因,因为我使用的是服务的类名,而令牌是由Javascript引擎根据该类名自动生成的

我尝试使用不透明令牌来控制注入,而且,同样,即使我使用的是相同的不透明令牌,当调用Injector.get()方法时,参数提供的令牌被认为与Injector存储的令牌不同

代码中的一个短片段如下所示

myservice.service.ts

import { OpaqueToken } from '@angular/core'

export const BACKEND = new OpaqueToken('backend');
app.module.ts

import { BACKEND } from 'myservice.service'
...
providers: [{ provide: BACKEND, useValue: "TestValue" }]
mycomponent.component.ts

import { Component, Inject } from '@angular/core'
import { BACKEND } from 'myservice.service'

@Component(
{
selector:'mycomponent'
templateUrl: ...
})
export class MyComponent
{
  constructor(@Inject(BACKEND) config: string) {
    console.info(JSON.stringify(config));
  }
}
这种后端令牌注入对某些组件有效,但对其他组件无效(注入空的{}对象)。我试着在浏览器中调试Javascript代码,看起来调用注入器时使用的令牌与来自字典的令牌不同(它们看起来相同,名称相同,但仍然不同,并且===返回false)

注意:我使用的是Angular 2.4.2、Typescript 2.1以及“commonjs”模块和“node”模块分辨率。systemjs用作模块加载器

请问,你能提供一些关于如何解决这个问题的想法吗

谢谢,

  • 您是否有来自不同模块/组件的各种提供者声明?对于提供者数组中的每个声明,angular将创建这些服务的新实例

  • 您是否在@Injectable装饰符中包含了括号

      • 您是否有来自不同模块/组件的各种提供者声明?对于提供者数组中的每个声明,angular将创建这些服务的新实例

      • 您是否在@Injectable装饰符中包含了括号


      您的进口产品似乎有点不寻常。您使用什么机制来避免在非
      节点_模块
      导入上放置一个前导的
      /
      ?实际上,我使用的是./or../取决于文件夹,因为应用程序非常大,并且按功能格式使用文件夹。您的导入似乎有点不寻常。您使用什么机制来避免在非
      节点_模块
      导入上放置前导的
      /
      ?实际上,我使用的是./or../取决于文件夹,因为应用程序很大,并且按功能格式使用文件夹。这并不能回答问题。一旦你有足够的钱,你就可以在任何岗位上工作。也请检查此项。@Injectable()decorator有括号,因为否则对某些组件不起作用。它更像是“您是否有来自不同模块/组件的各种提供程序声明”,但方式很奇怪。显然,即使在不同的文件中,我也没有使用同名的两个服务,但我的文件夹大小写不一。当我将文件夹重命名为仅使用小写字母时,问题就解决了。我使用Windows计算机进行开发。这并不能回答这个问题。一旦你有足够的钱,你就可以在任何岗位上工作。也请检查此项。@Injectable()decorator有括号,因为否则对某些组件不起作用。它更像是“您是否有来自不同模块/组件的各种提供程序声明”,但方式很奇怪。显然,即使在不同的文件中,我也没有使用同名的两个服务,但我的文件夹大小写不一。当我将文件夹重命名为仅使用小写字母时,问题就解决了。我使用Windows计算机进行开发。