Angular 组件提供程序和模块提供程序的区别

Angular 组件提供程序和模块提供程序的区别,angular,Angular,@组件提供程序属性和@模块提供程序之间的区别是什么 两者都代表什么 编辑 我有两个组件:LoginComponent和SigninComponent。另一方面,我正在使用来自定制库的UserService。此用户服务服务正在查找opaquetoken基本路径: @Injectable() export class UsersService { constructor(@Optional()@Inject(BASE_PATH) 基本路径是: export const BASE_PATH

@组件提供程序
属性和
@模块提供程序
之间的区别是什么

两者都代表什么

编辑

我有两个组件:
LoginComponent
SigninComponent
。另一方面,我正在使用来自定制库的
UserService
。此
用户服务
服务正在查找opaquetoken
基本路径

@Injectable()
export class UsersService {
    constructor(@Optional()@Inject(BASE_PATH)
基本路径是:

export const BASE_PATH = new OpaqueToken('basePath');
此opaqueToken在AppModule上设置:

@NgModule({
  bootstrap: [ App ],
  declarations: [
    App,
    ErrorComponent
  ],
  providers: [
    ENV_PROVIDERS,
其中,
ENV_PROVIDERS
是根据
environment.ts
上的环境设置设置的:

if ('production' === ENV) {
  enableProdMode();

  PROVIDERS = [
    ...PROVIDERS,
    // custom providers in production
    { provide: BASE_PATH, useValue: 'http://public.sample.com:8082/commty/cmng' }
  ];

} else {

  // Development
  PROVIDERS = [
    ...PROVIDERS,
    // custom providers in development
    { provide: BASE_PATH, useValue: 'http://localhost:8082/commty/cmng' }
  ];

}

export const ENV_PROVIDERS = [
  ...PROVIDERS
];
我正在设置所有:

@NgModule({
  declarations: [
    SigninComponent
  ],
  providers: [ UsersService ]
})
export default class SigninModule {

所以,在组件上,我不作为提供者导入任何服务,我只声明它们


然而,当我加载
SigninModule
时,我的所有网络请求都会发送到
localhost
。但是,当我加载
LoginModule
时,请求被发送到
localhost:8282
如果您在组件内部提供服务,则它将是它的本地服务。 因此,如果您有两个组件实例,那么您将有两个服务实例

现在,如果您在模块内提供服务,它将是全局的,如果您有两个组件实例,它们将共享同一个服务实例


如果您不明白,请告诉我,我将为您提供一个关于plunker的示例。

引用官方文档:

一方面,NgModule中的提供者在根目录中注册 注射器。这意味着每个在NGM模块中注册的提供商 将可在整个应用程序中访问

另一方面,在应用程序组件中注册的提供程序仅在该组件及其所有子组件上可用


我想我明白了。然而,模块和子模块呢?理论上,如果您在模块内提供它,服务实例将影响模块的所有范围。包括它的子模块。如果我向
Service1
的提供者声明一个模块,然后在子模块中再次声明它,会怎么样?我也意识到我需要同时声明模块和组件上的组件…?您需要在模块和组件中声明它,但不需要在两者中都提供它。
@NgModule({
  declarations: [
    LoginComponent
  ],
  providers: [ UsersService ]
})
export default class LoginModule {