组件提供商与模块提供商的区别

Jor*_*rdi 9 angular

@Components providers属性和@Module providers?之间有什么区别?

两者都代表什么?

编辑

我有两个组成部分:LoginComponentSigninComponent.另一方面,我使用的UserService是定制的库.这项UserService服务正在寻找一个opaquetoken BASE_PATH:

@Injectable()
export class UsersService {
    constructor(@Optional()@Inject(BASE_PATH)
Run Code Online (Sandbox Code Playgroud)

BASE_PATH是:

export const BASE_PATH = new OpaqueToken('basePath');
Run Code Online (Sandbox Code Playgroud)

这个opaqueToken在AppModule上设置:

@NgModule({
  bootstrap: [ App ],
  declarations: [
    App,
    ErrorComponent
  ],
  providers: [
    ENV_PROVIDERS,
Run Code Online (Sandbox Code Playgroud)

其中ENV_PROVIDERS被设置为根据environtment设置上environtment.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
];
Run Code Online (Sandbox Code Playgroud)

我正在设置所有:

@NgModule({
  declarations: [
    SigninComponent
  ],
  providers: [ UsersService ]
})
export default class SigninModule {
Run Code Online (Sandbox Code Playgroud)

@NgModule({
  declarations: [
    LoginComponent
  ],
  providers: [ UsersService ]
})
export default class LoginModule {
Run Code Online (Sandbox Code Playgroud)

因此,在组件上,我不会将任何服务作为提供者导入,我只声明它们.

不过,当我加载SigninModule所有网络请求时都会发送给localhost.但是,当我加载LoginModule请求被发送到localhost:8282

小智 19

如果您在组件内提供服务,它将是本地服务.因此,如果您有两个组件实例,那么您将拥有两个服务实例.

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

告诉我,如果你不明白,我会提供一个关于plunker的例子.