Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确使用异步管道更新angular 7中的模板_Angular_Rxjs_Observable_Behaviorsubject_Subject Observer - Fatal编程技术网

如何正确使用异步管道更新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);
    })
  );
}
然后在my
getData组件中

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>