Root与@Injectable提供的元数据有什么选择

时间:2018-11-12 11:46:49

标签: javascript angular angular6

我可以使用ModuleWithProviders forRoot静态方法向根模块注册某些服务,因为这些服务在不同模块内的几个组件之间共享。

export class SharedModule {
    static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [ CounterService ]
    }
  }
}

但是对于角度6,如果需要向根注入器注册服务,只需使用@Injector装饰器(将provedIn元数据设置为“根”)即可完成。

@Injectable({
  providedIn: 'root'
})
export class UserService {

}

那么哪种方法合适才是我应该遵循的方法?

forRoot也将过时吗?

模块中的提供方数组会发生什么?

2 个答案:

答案 0 :(得分:0)

当模块同时提供声明和提供程序时,在角度上,它将在注入子级时复制提供程序实例,这可能会导致实例上可能是单例的问题。 因此,Angular提供了一种将提供程序从模块中分离出来的方法,以便可以将具有提供程序的相同模块导入到具有提供程序的根模块中,而将没有提供程序的子模块导入到根模块中。

答案 1 :(得分:0)

providedIn是用于创建单例(即在根注入器中声明的提供者)的新语法。

您可以在任何其他模块中提供它,但是rootAppModule的简写。

它使您可以非常快速地安装依赖项,而无需任何其他配置。

因此,forRoot不会过时,因为它允许人们能够通过它配置模块。

我想说,您应该为提供商使用providedIn语法,如果他们需要配置,则可以使用forRoot