如何正确使用异步管道更新angular 7中的模板
我有一个服务方法,它获取虚拟数据并返回一个可观察数据如何正确使用异步管道更新angular 7中的模板,angular,rxjs,observable,behaviorsubject,subject-observer,Angular,Rxjs,Observable,Behaviorsubject,Subject Observer,我有一个服务方法,它获取虚拟数据并返回一个可观察数据 private dummySubject = new BehaviorSubject<Dummy>(null); dummy$ = this.dummySubject.asObservable(); loadDummyData(id: string): Observable<Dummy> { const BASE_URL = 'someurl/' + id; return this.http.get<
private dummySubject = new BehaviorSubject<Dummy>(null);
dummy$ = this.dummySubject.asObservable();
loadDummyData(id: string): Observable<Dummy> {
const BASE_URL = 'someurl/' + id;
return this.http.get<Dummy>(BASE_URL).pipe(
tap((dummyData: Dummy ) => {
console.log('In Service ', dummyData); //LOGS DATA HERE
this.dummySubject.next(dummyData);
})
);
}
然后在mygetData组件中
localData: Dummy;
dummy$: Observable<Dummy> = this.dummyService.dummy$;
ngOnInit() {
1) this.anotherService.loadDummyData(); //Causes data to be loogged in service
2) this.dummyService.loadDummyData('12345').subscribe( //causes data logged in service
(dummy: Dummy) => {
this.localProfile = dummy;
console.log(this.localProfile, 'data in component'); //local data log
},
err => {
console.error(err);
}
);
console.log(this.localProfile, 'In ngOnint'); //undfiened
}
我在这里遗漏了什么?您没有在任何地方分配dummyData
更改为:
loadDummyData(): Observable<Dummy> {
return this.dummyService.user$.pipe(
switchMap((user: User) => this.dummyService.loadDummyData(user.id)),
);
}
loadDummyData():可观察{
返回此.dummyService.user$.pipe(
switchMap((user:user)=>this.dummyService.loadDummyData(user.id)),
);
}
及
dummy$:Observable=this.dummyService.dummy$;
恩戈尼尼特(){
this.dummy$=this.anotherService.loadDummyData();
您没有在任何地方分配dummyData
更改为:
loadDummyData(): Observable<Dummy> {
return this.dummyService.user$.pipe(
switchMap((user: User) => this.dummyService.loadDummyData(user.id)),
);
}
loadDummyData():可观察{
返回此.dummyService.user$.pipe(
switchMap((user:user)=>this.dummyService.loadDummyData(user.id)),
);
}
及
dummy$:Observable=this.dummyService.dummy$;
恩戈尼尼特(){
this.dummy$=this.anotherService.loadDummyData();
由于您尚未提交完整的代码,这里明显存在的问题是dummy$未被分配到dummyService中的预期值。您必须在dummy$中分配值,就像this.dummy$=this.dummySubject.asObservable();
那样,只有您才能在组件中使用它的值
其中是loadUserProfile方法
在您的例子中,如果删除异步管道并将html与localProfile绑定,那么它也会起作用
更改您的html
<div *ngIf="localProfile">
<span class="pull-right" *ngIf="localProfile.canViewAdmin">
<a (click)="openChangeUserModal()">Change user</a>
</span>
<p>{{localProfile.name}}</p>
</div>
更改用户
{{localProfile.name}
在subscribe回调之外,localProfile将是未定义的,因为它是异步调用。因为您还没有提交完整的代码,这里明显的问题是dummy$没有在dummyService中分配预期的值。您必须在dummy$中分配值,如this.dummy$=this.dummySubject.asObservable();
则只有您可以在组件中使用其值
其中是loadUserProfile方法
在您的例子中,如果删除异步管道并将html与localProfile绑定,那么它也会起作用
更改您的html
<div *ngIf="localProfile">
<span class="pull-right" *ngIf="localProfile.canViewAdmin">
<a (click)="openChangeUserModal()">Change user</a>
</span>
<p>{{localProfile.name}}</p>
</div>
更改用户
{{localProfile.name}
在订阅回调之外,localProfile将是未定义的,因为它是异步调用。我已经更新了这个问题,当我们尝试在订阅正文之外调用它时,localProfile变量返回undefined。如果添加到模板中,则会导致模板错误。我做了如上所述的操作。localProfile会导致模板问题,看起来像localProfile var没有在订阅主体之外填充。那么你的console.log为什么在订阅主体内部工作呢?这是一个很好的问题。我在订阅主体之外记录了它,但它没有定义,我认为这与服务调用是异步调用,而控制台是同步的有关。我已经更新了这个问题,l当我们尝试在订阅正文外部调用ocalProfile变量时,它返回undefined。如果添加到模板,则会导致模板错误。我做了如上所述的操作。localProfile会导致模板问题,看起来localProfile变量不会在订阅正文外部填充。您的console.log如何在订阅正文内部工作n那么?这是一个很好的问题。我在subscribe主体之外记录了它,但它没有定义,我认为这与服务调用是异步调用有关,而控制台是同步的。
<div *ngIf="localProfile">
<span class="pull-right" *ngIf="localProfile.canViewAdmin">
<a (click)="openChangeUserModal()">Change user</a>
</span>
<p>{{localProfile.name}}</p>
</div>