Angular 从我的服务文件中作为目标时未反映对BehaviorSubject的更新
我正在使用Angular 从我的服务文件中作为目标时未反映对BehaviorSubject的更新,angular,typescript,Angular,Typescript,我正在使用*ngIf在我的HomeComponent中的3个组件之间切换。目前,我主要关注其中两个组件之间的关系,即ProductListComponent和ProductDetailComponent。在ProductListComponent中,我有一个ProductListItemComponent用于迭代每个产品。在我的HomeService内部,我正在使用BehaviorSubject类型的变量在HomeComponent中订阅要响应的*ngIf条件。myHomeService中的设置
*ngIf
在我的HomeComponent
中的3个组件之间切换。目前,我主要关注其中两个组件之间的关系,即ProductListComponent
和ProductDetailComponent
。在ProductListComponent
中,我有一个ProductListItemComponent
用于迭代每个产品。在我的HomeService
内部,我正在使用BehaviorSubject
类型的变量在HomeComponent
中订阅要响应的*ngIf
条件。myHomeService
中的设置如下所示
//variable with the initial value
private FrameToggle: BehaviorSubject<string> = new BehaviorSubject('product-list');
//variable for watching BehaviorSubject as Observable
CurrentToggle = this.FrameToggle.asObservable();
//function for setting the BehaviorSubject
setFrameToggle(page: string){ this.FrameToggle.next(page); }
sendPageToggle(page: string){ this.homeService.setFrameToggle(page); }
在模板内部,我用这样的按钮触发它
<button (click)="sendPageToggle('value-to-trigger-desired-component'")>some text</button>
async prepareData(key: string, page: string){
await (()=> {this.ProductData = this.setData(page);})();
this.homeService.setFrameToggle(key);
}
我在我的ProductListComponent
中创建了一个函数来调用此函数,该函数可以正常工作,但是该组件不会像从组件内部调用setFrameToggle()
函数时那样进行切换
我在prepareData()
函数中添加了一个console.log()
变量,目标是ProductData
,并看到数据已成功加载。然后,我在HomeService
中的setFrameToggle()
函数中添加了console.log()
,以记录从ProductDetailComponentService
中的prepareData()
函数传入的值,该函数也成功返回结果
我甚至复制了该函数,从中删除了async
,并删除了第一部分,因此该函数只调用setFrameToggle()
主服务中的功能只是想看看是否有一些隐藏的承诺
混乱影响了发送的值的类型,但组件仍然没有切换。我将HomeService
作为提供者正确导入到ProductDetailComponent
的模块中,我不知道是什么原因导致它无法工作。有人能看出我做错了什么吗?基于此
ProductListItemComponent和ProductDetailComponent I的内部
将HomeService作为提供者导入
我猜您正在处理多个HomeService实例。每当您将服务标记为组件或模块的提供者时,它都会将其限定为该组件或模块的范围,因此它不再是应用程序的单例,而是限定为您添加它的级别。因此,如果我将一个服务添加到我的组件提供者数组中,那么该组件的每个实例将获得该服务的不同实例
验证这一点的最简单方法(假设您使用的是支持这一点的Angular版本)是将HomeService更改为根注入,并将其从任何模块或组件设置中的所有提供程序阵列中删除:
@Injectable({
providedIn: 'root'
})
export class HomeService{
或者,只需再次检查homeService是否仅在一个提供商阵列中,并且它的级别应高于与之交互的所有组件。我将对此进行投票,因为您确实花了时间来解释这个问题,但是如果你能写一个小的总结就好了:)如果你能提供最小的stackbitz demook就更好了。我在这里坐了两个多小时,试图在stackblitz上构建它,结果它在连接到开发服务器时陷入了困境,我不知道问题从哪里开始,如何开始。我本来可以在我自己的机器smh上解决这个问题的。我是否应该将它导入到我的组件中,并在构造函数中设置一个私有变量?现在我想起来了,近一周前,我在使用其他服务中的服务时遇到了另一个小问题,那就是当我了解到我们现在需要将它们导入到该组件的模块中,并将其添加到提供者的阵列中以避免出现问题时,这意味着我需要将其导入到多个模块中。这有什么不同吗?还是它仍然导致了我的问题?是的,你的构造函数都是一样的。你只需要小心你如何设置你的服务提供商。根据您使用服务的方式,有时应将其设置为组件中的提供者,有时则应设置为根目录或模块中提供的提供者。从我掌握的信息来看,很难告诉你应该如何设置。如果您遇到问题,您在服务上设置了一些内容,但在从服务中拉出时,在其他地方没有反映出来(10次中有9次),这是因为您有多个服务实例,但没有意识到这一点。