从组件角度监听服务变量变化

Dav*_*vid 2 variables service components angular

我有将数据带到该变量的变量和方法的服务

export class UserService {
  userDetails;
  getUserProfile(){
    return this.http.get(this.BaseURI+'/UserProfile').subscribe(
      res=>{
        this.userDetails=res;
      //  console.log(res);
      },
      err=>{
        console.log(err);
      }
    );
  }
Run Code Online (Sandbox Code Playgroud)

现在我想在变量更改时从组件中检查并读取它。我怎样才能做到这一点 ?

更新。

export class UserService {
  userDetails;

  getUserProfile(){
  this.http.get(this.BaseURI+'/UserProfile').subscribe(
    res=>{
      this.userDetails=res;
    },
    err=>{
      console.log(err);
    }
  )
  }
Run Code Online (Sandbox Code Playgroud)

在组件中,我有这个:

  ngOnInit() {
    this.service.userDetails.subscribe((userDetails) =>this.userDetails=userDetails)
  }
Run Code Online (Sandbox Code Playgroud)

现在,当我运行该应用程序时,组件出现错误:

AppComponent.html:2 错误类型错误:无法读取未定义的属性“订阅”

xyz*_*xyz 9

我相信当您的 get 请求完成时,您基本上需要组件中的数据。

解决方案 1:考虑将userDetailsmake 作为 Observable, . 这样你就可以在它的值改变时收听它

export class UserService {

    private _userDetails: Subject<any> = new Subject<any>();    // consider putting the actual type of the data you will receive
    public userDetailsObs = this._userDetails.asObservable();
    getUserProfile(){
        return this.http.get(this.BaseURI+'/UserProfile').subscribe(
          res=>{
            this._userDetails.next(res)
          //  console.log(res);
          },
          err=>{
            console.log(err);
          }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的组件内部

constructor(private _userService: UserService) {}

ngOnInit() {
    this._userService.userDetailsObs.subscribe((userDetails) => {
        console.log(userDetails)
    })
}
Run Code Online (Sandbox Code Playgroud)

解决方案 2. 考虑只返回 HTTP observable 本身。

getUserProfile(){
    return this.http.get(this.BaseURI+'/UserProfile');
}
Run Code Online (Sandbox Code Playgroud)

在您的组件内部

constructor(private _userService: UserService) {}

ngOnInit() {
    this._userService.getUserProfile.subscribe((userDetails) => {
        console.log(userDetails)
    })
}
Run Code Online (Sandbox Code Playgroud)