0

假设有一个父组件 P 。有两个子组件 B 和 C 。我在 P 的 ElementInjector 中提供了一个服务(假设是 MyService),并在 P 组件类的构造函数中注入了该服务。我在两个子组件 B 和 C 中再次注入服务。

我的问题是在这种情况下 B、C 和 P 可用的服务实例是否相同?

如果我只在两个子组件 B 和 C 而不是在父组件 P 中注入服务怎么办。在这种情况下,B 和 C 会有单独的 MyService 服务实例吗?

这是帮助可视化组件的图像。 父组件 P 与子组件 B 和 C

编辑:

服务等级:

@Injectable()
export class MyService(){
   constructor(){
console.log('My Service instantiated');
}
}

P组件的类:

import {MyService} from '...';

@Component({

selector:'Pcomp',
...
providers:[MyService]
})

export class PComponent {
 constructor(public myservice:MyService){
}
}

组件 B 类:

import {MyService} from '...';

@Component({

selector:'Bcomp',
...

})

export class BComponent {
 constructor(public myservice:MyService){
}
}

组件 C 类:

import {MyService} from '...';

@Component({

selector:'Ccomp',
...
})

export class CComponent {
  constructor(public myservice:MyService){
}
}
4

2 回答 2

0

服务被/被用作跨模块的单例。从 Angular 9 开始,服务现在不仅仅是单例了。我的意思是拥有一个带有延迟加载模块的新服务实例。

延迟加载是仅在需要时才加载模块;例如,当路由时。它们不会像急切加载的模块那样立即加载。这意味着它们的提供者数组中列出的任何服务都不可用,因为根注入器不知道这些模块。 -- angular.io 指南

因此,这完全取决于您对元数据的使用,尤其是 providedIn在服务注入装饰器和providers组件装饰器中的使用。

在上述情况下,如果我们限制MyService为组件的提供者,它将被限制为该组件。提到上面的一段代码如下。

@Component({
    selector:'Pcomp',
...
    providers:[MyService]
})

由于提供者处于Pcomp水平状态,并且Pcomp它的后代可以作为单例加以利用。BcompCcompMyService

参考:https ://angular.io/guide/providers#limiting-provider-scope-with-components

于 2020-08-01T03:55:11.573 回答
0

如果您使用 Angular CLI,将使用类似这样的内容生成服务

@Injectable({
  providedIn: 'root',
})  

因此服务是作为单例生成的,这意味着应用程序中只能存在一个实例。我认为建议将服务创建为单例。

于 2020-07-30T12:18:56.483 回答