侦听服务变量从组件角度的变化

时间:2019-03-20 11:13:02

标签: angular variables service components

我提供了带有变量的服务以及将数据带到该变量的方法

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

现在我想从组件中检查变量何时更改并读取它。我该怎么办?

更新。

export class UserService {
  userDetails;

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

在组件中我有这个:

  ngOnInit() {
    this.service.userDetails.subscribe((userDetails) =>this.userDetails=userDetails)
  }

现在,当我运行应用程序时,出现以下错误:

  

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

2 个答案:

答案 0 :(得分:1)

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

解决方案1:考虑将userDetails设为可观察的。这样,您可以在其中的值更改时收听它

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);
          }
        );
    }
}

在组件内部

constructor(private _userService: UserService) {}

ngOnInit() {
    this._userService.userDetailsObs.subscribe((userDetails) => {
        console.log(userDetails)
    })
}

解决方案2.考虑仅返回HTTP可观察到的自身。

getUserProfile(){
    return this.http.get(this.BaseURI+'/UserProfile');
}

在组件内部

constructor(private _userService: UserService) {}

ngOnInit() {
    this._userService.getUserProfile.subscribe((userDetails) => {
        console.log(userDetails)
    })
}

答案 1 :(得分:0)

让您的服务具有以下功能:

export class UserService {
  getUserProfile(){
   return this.http.get(this.BaseURI+'/UserProfile');
 );
}

然后在您的组件中订阅它。

import { Component, OnInit } from '@angular/core';
import {ServiceName} from '../servicename.service';

export class ViewComponent implements OnInit {

constructor(private serviceName:ServiceName) { }
public userDetails={};
ngOnInit() {
 this.serviceName.getUserProfile().subscribe(res=>this.userDetails=res);
  }
}