Angular 无法订阅主题数据
我正在使用共享服务使用Subject发送数据。在一个组件中,我试图订阅主题数据,但它从未订阅 我通过组件A中的主题发送索引数据,如下所示 A部分Angular 无法订阅主题数据,angular,angular6,angular7,Angular,Angular6,Angular7,我正在使用共享服务使用Subject发送数据。在一个组件中,我试图订阅主题数据,但它从未订阅 我通过组件A中的主题发送索引数据,如下所示 A部分 export class ComponentA { onEditTestCase(index: number){ this.sharedService.startedEditing.next(index); } } 我正在使用一个共享服务来使用Subject发出索引数据。 共享服务 import { Subject } from 'r
export class ComponentA {
onEditTestCase(index: number){
this.sharedService.startedEditing.next(index);
}
}
我正在使用一个共享服务来使用Subject发出索引数据。
共享服务
import { Subject } from 'rxjs/Subject';
export class SharedService {
constructor(private sharedService: SharedService, private router: Router) {}
startedEditing = new Subject<number>();
}
我在上面的代码中是否做错了什么?将主题更改为私有属性,并使用属性getter将主题作为可观察对象返回。 还要确保您使用的是相同的服务实例,将其定义为模块级的提供者或父组件内部的一级提供者
import { Subject } from 'rxjs/Subject';
export class SharedService {
private startedEditing = new Subject<number>();
public get StartEditing(): Observable<number> {
return this.startedEditing.asObservable();
}
从'rxjs/Subject'导入{Subject};
导出类共享服务{
private startedEditing=新主题();
public get StartEditing():可观察{
返回此.startedEditing.asObservable();
}
尝试使用ReplaySubject
而不是Subject
尝试实现下面的代码
common.setvice.ts
import { Injectable } from '@angular/core';
import {ReplaySubject} from 'rxjs/ReplaySubject';
@Injectable({
providedIn: 'root'
})
export class CommonService {
private startedEditing = new ReplaySubject<any>();
public startedEditing$ = this.startedEditing.asObservable();
constructor() { }
setData(data) {
this.startedEditing.next(data);
}
}
b、 组件技术
import { Component } from '@angular/core';
import { CommonService } from './common.service'
@Component({ templateUrl: 'b.component.html' })
export class BComponent {
constructor(
private commonService: CommonService
) { }
ngOnInit() {
this.commonService.startedEditing$.subscribe(data => {
console.log(data); // this will print "data from component A";
});
}
}
如果上面的代码不清楚,请告诉我。可能的重复项您是否在两个组件中使用相同的sharedService实例?服务是否为单例?您如何在组件a和组件B中创建服务实例?您向我们展示的服务没有@Injectable注释,并且您没有向我们展示组件的构造函数。我有e添加了构造函数代码。返回一个主题和一个可观察的有什么区别?没有逻辑上的区别。它更干净,因为你阻止组件调用next()。我不理解公共服务代码。我的代码中的“data”和“startedEditing”相同吗?@raghul selvayes!我用“startedEditing”更新了代码variableI使用了与您提到的相同的代码。在不发送数据的情况下,我尝试加载组件并获取订阅。当我发送一些数据时,它必须订阅。这是因为BehaviorSubject需要初始值才能启动,这就是为什么我们在声明时传递“null”,我已使用“ReplaySubject”更新了代码,这不需要主动性,现在检查并让我知道参考:我使用了ReplaySubject,setData方法在CommonService中被调用,但在组件B中它没有被订阅。使用行为主题它被订阅了,但它有一个初始值。现在不确定出了什么问题
import { Component } from '@angular/core';
import { CommonService } from './common.service'
@Component({ templateUrl: 'a.component.html' })
export class AComponent {
constructor(
private commonService: CommonService
) { }
ngOnInit() {
this.commonService.setData('data from component A');
}
}
import { Component } from '@angular/core';
import { CommonService } from './common.service'
@Component({ templateUrl: 'b.component.html' })
export class BComponent {
constructor(
private commonService: CommonService
) { }
ngOnInit() {
this.commonService.startedEditing$.subscribe(data => {
console.log(data); // this will print "data from component A";
});
}
}