【发布时间】:2021-05-19 18:10:36
【问题描述】:
我有一个名为 edit-order.component 的组件,其中包含以下 ts 文件
export class EditOrderComponent implements OnInit {
constructor(private editOrderSrv: EditOrderService, private route: ActivatedRoute) { }
ngOnInit(): void {
this.editOrderSrv.getOrderById(this.route.snapshot.params.id);
}
}
在我的edit-order-service.service.ts 我有以下代码
export class EditOrderService {
order$: BehaviorSubject<any> = new BehaviorSubject(null);
constructor(private http: HttpClient) { }
getOrderById(id: string){
this.http.get('url', {params: {id}}).subscribe(order => {
this.order$.next(order);
}, error => {console.error(error)});
}
}
客户端应该能够打开多个edit-order.component 和不同的id。在我的child.component,我想像这样订阅order$
export class ChildComponent implements OnInit {
order: any;
constructor(private editOrderSrv: EditOrderService) { }
ngOnInit(): void {
this.editOrderSrv.order$.subscribe(order => {
if(order) this.order = order;
})
}
}
但因此我必须为每个edit-order.component 拥有自己的服务实例,以免覆盖order$。我将如何实现这一目标?或者这是不可能的?如果不可能,我还能做些什么来实现我的目标?
【问题讨论】:
-
为什么要使用单独的
BehaviorSubject?您可以只返回getOrderById()返回的 observable。 -
@rveerd 稍后。我有多个 edit-order.component 的子组件,并且我必须在服务中为该特定订单存储多个变量。这就是为什么我需要不同的实例来不覆盖变量,以便我可以访问相应订单的正确变量。
-
如果您使用的是角度路由,那么您可以在 id 的基础上使用相同的组件,也可以使用相同的服务实例。当前的实现对我来说似乎有点不寻常。
-
@Invader 我认为您不应该在服务中存储特定于组件的数据。将其存储在组件中。仅将服务用于“服务”,例如从 Web 服务获取数据。
-
如果您确实需要每个组件实例的服务,您可以使用dependency providers 来实现。
标签: angular typescript service