Angular 在行为主题订阅中未定义
我试图订阅一个由父组件设置的Angular 在行为主题订阅中未定义,angular,rxjs,Angular,Rxjs,我试图订阅一个由父组件设置的行为主题,并将其放入子组件,我试图在我的组件中创建以下内容: export class ModuliComponent implements OnInit { public profilo: Profilo; constructor(public profiloService: ProfiloService) { } ngOnInit(): void { this.profiloService.dataProfilo.subscribe(dat
行为主题
,并将其放入子组件,我试图在我的组件中创建以下内容:
export class ModuliComponent implements OnInit {
public profilo: Profilo;
constructor(public profiloService: ProfiloService) { }
ngOnInit(): void {
this.profiloService.dataProfilo.subscribe(data => this.profilo = data); // setting profilo
}
}
但是当我尝试在HTML中使用profilo
时,我只会在asporto
或其他*ngIf上得到undefined
我做错了什么?我是否应该首先初始化profilo
?如果是这样,即使通过设置onInit
或在constructor
中profilo=new profilo()代码>我得到未定义的相同错误
如果我将console.log设置为subscribe,它将返回正确的数据,因此asporto和subscribe中的其他内容不是未定义的
这里要求的是ProfiloService
@Injectable({
providedIn: 'root'
})
export class ProfiloService {
public dataProfilo = new BehaviorSubject<any>([]);
constructor(private http: HttpClient, private adapter: ProfiloAdapter) { }
profilo(idNegozio: string): Observable<Profilo>{
return this.http
.get(`${Globals.API_URL}/profilo/${idNegozio}`)
.pipe(map((data: any) => this.adapter.adapt(data)));
}
}
Console.Log来自订阅数据
编辑:
如果我添加了父div*ngIf=“profilo.moduli”
,它会工作得很好,但是在这一点上,如果profilo是未定义的w为什么它不足以在html中使用一个简单的*ngIf=“profilo”?接线员
<div *ngIf="profilo?.moduli?.ticketing" ></div>
在html中使用?接线员
<div *ngIf="profilo?.moduli?.ticketing" ></div>
初始化子组件时,profilo变量未定义,API返回数据时profilo变量只有数据。因此,u可以使用“?”运算符或按如下方式检查profilo var
<div *ngIf="profilo?.moduli?.ticketing" ></div>
或
初始化子组件时,profilo变量未定义,API返回数据时profilo变量只有数据。因此,u可以使用“?”运算符或按如下方式检查profilo var
<div *ngIf="profilo?.moduli?.ticketing" ></div>
或
如果默认情况下将有一个空数组,并检查它是否在模板中未定义,我建议您改为与buffer 1一起使用。它类似于BehaviorSubject
,但不需要默认值
@可注入({
providedIn:'根'
})
出口级ProfiloService{
public dataProfilo=改为使用新的ReplaySubject管道。至少,它解决了取消订阅问题
子组件
导出类ModuleComponent实现OnInit{
公共利润$:可见;
构造函数(公共profiloService:profiloService){}
ngOnInit():void{
this.profilo$=this.profiloService.dataProfilo;
}
}
模板
...
标记中的模板不必更改,因为我们使用*ngIf
指令的作为
签名来表示可观察的当前值。如果默认情况下要有一个空数组,并检查它在模板中是否未定义,我建议您使用缓冲区1。它类似于BehaviorSubject
,但不需要默认值
@可注入({
providedIn:'根'
})
出口级ProfiloService{
public dataProfilo=改为使用新的ReplaySubject管道。至少,它解决了取消订阅问题
子组件
导出类ModuleComponent实现OnInit{
公共利润$:可见;
构造函数(公共profiloService:profiloService){}
ngOnInit():void{
this.profilo$=this.profiloService.dataProfilo;
}
}
模板
...
标记中的模板不必更改,因为我们使用*ngIf
指令的作为
签名来表示可观察的当前值。分享ProfiloService
的相关代码service@Satpal在订阅中添加了服务你能做什么合作吗nsole.log(data)
并请使用控制台数据或console@SivakumarTadisetti添加了console.log,如果在服务中我将BehaviorSubject
设置为newBehaviorSubject(new Profilo);
并且我将执行*ngIf=“Profilo.id”
而不是*ngIf=“Profilo”
它会起作用,但我希望有一个更干净的解决方案,其中profilo未定义,并且*ngIf=“profilo”
分享ProfiloService
的相关代码service@Satpal在subscribe
canyoudoconsole.log(数据)中添加了服务
并请使用控制台数据或console@SivakumarTadisetti添加了console.log,如果在服务中我将BehaviorSubject
设置为newBehaviorSubject(new Profilo);
并且我将执行*ngIf=“Profilo.id”
而不是*ngIf=“Profilo”
它会起作用,但我希望有一个更干净的解决方案,其中profilo未定义,*ngIf=“profilo”
但为什么*ngIf=“profilo”如果profilo未定义,则返回错误而不是false?您的服务返回响应吗?您可以共享您的响应吗?服务返回响应的方式就像我将console.log
设置为this.profiloService.dataProfilo.subscribe(data=>console.log(data));
它返回所有的值。您可以共享您的响应吗?您的Profilo接口是否有端口?但为什么*ngIf=“Profilo”如果profilo未定义,则返回错误而不是false?您的服务返回响应吗?您可以共享您的响应吗?服务返回响应的方式就像我将console.log
设置为this.profiloService.dataProfilo.subscribe(data=>console.log(data))
它返回所有值扫描您是否可以共享您的响应?您的Profilo接口是否有端口?