区别在于服务的范围
我是Angular的新手,我有一个问题:
方法1:
@Injectable()
export class classA {
constructor(
private service1: Service1,
private service2: Service2) {
}
}
在应用模块中]
providers: [ { provide: classA , useFactory: authServiceFactory, deps: [ RoleService, LogService ] } ] export function authServiceFactory(roles: RoleService, log: LogService) { const service = new AuthenticationService(roles, log); return service; }
方法2:
@Injectable({ providedIn: 'root' }) export class classA{ constructor( private service1: Service1, private service2: Service2) }
和
@Injectable({ providedIn: 'root' }) export class Service1{ }
和
@Injectable({ providedIn: 'root' }) export class Service2{ }
并且app.module中没有提供者。
我想知道这些方法有什么不同。我已经尝试了方法1以及方法2。
我是Angular的新手,我有一个问题:方法1:@Injectable()导出类classA {app.module中的构造方法(私有服务1:服务1,私有服务2:服务2){}}}]] >>
区别在于服务的范围
这会将相同的服务实例注入所有组件。这称为单例:
@Injectable({
providedIn: 'root'
})
export class MyService {
}
这会将相同的服务实例注入所有组件在该模块中
:@NgModule({
providers: [ MyService ]
})
export class MyModule {}
如果只有一个模块-AppModule
-两种方法之间没有区别-它们是等效的。在这种情况下,建议将所有服务声明为providedIn: 'root'
。
如果有多个模块,则可以声明单例服务,也可以通过在模块providers: []
中覆盖它来选择在其中一个模块中提供特定于模块的版本。
举这个例子:
@Injectable({ providedIn: 'root' }) export class MyService { } @NgModule({ declarations: [ ComponentA, ComponentB ] }) export class AppModule { } @NgModule({ declarations: [ FeatureComponentA, FeatureComponentB ], providers: [ MyService ] }) export class MyFeatureModule { } @NgModule({ declarations: [ OtherComponentA, OtherComponentB ] }) export class MyOtherModule { }
ComponentA
,ComponentB
,OtherComponentA
,OtherComponentB
在注入时都将接收到MyService
的相同实例。[
FeatureComponentA
和FeatureComponentB
将收到MyService
的第二个实例,因为在声明组件的模块中声明了提供者。
区别在于服务的范围