Angular 2+并将数据存储在服务中的http变量中

时间:2018-01-08 20:03:38

标签: angular

我的服务中有getPrivateLesson(),它返回对象数组。如何在服务中运行该函数(一次,在初始化时)并将返回的数据存储在变量filteredPrivateLessons中?我试过主题和构造函数但没有正面效果。

@Injectable()
export class PrivateLessonsService {

  private _privateLessonsUrl: string = "http://localhost:3000/api/lessons";
  public filteredPrivateLessons: PrivateLesson[];
  public filteredPrivateLessonsUpdate = new EventEmitter<PrivateLesson[]>();

  private privateLessonsSubject = new Subject<any>()
  public privateLessonsChange$ = this.privateLessonsSubject.asObservable();


  constructor(private _http: Http,  private _httpClient: HttpClient) {

    this.privateLessonsChange$.subscribe(response => {
      this.filteredPrivateLessons = this.getPrivateLessons();
    });

  }

  getPrivateLessons() : any {
    return this._http.get(this._privateLessonsUrl)
      .map( (response: Response) => response.json() );    
  }

  getFilteredPrivateLessons() {
    return this.filteredPrivateLessons;
  }
  setFilteredPrivateLessons(privateLessons: PrivateLesson[]) {
    this.filteredPrivateLessons = privateLessons;
    this.filteredPrivateLessonsUpdate.emit(this.filteredPrivateLessons);
  }

}

2 个答案:

答案 0 :(得分:0)

您可以在app.component中注入此服务,并像这样调用函数:

app.component.ts:

    ngOnInit(){
        this._privateLessonsService.getPrivateLessons().subscribe(
        success =>{
          this._privateLessonsService.filteredPrivateLessons = success;
        },
        error =>{
          //Handle error here
        }
      );
    } 

然后,您可以在应用程序的其余部分假设阵列已准备就绪并存储在服务对象中。如果您需要阅读它,请注入该服务,您将可以访问它:

this._privateLessonsService.filteredPrivateLessons

此处不需要主题,因为您不需要在更改该数组后执行操作。您只需下载一次即可访问它!

答案 1 :(得分:0)

来自@Rahul Gupta的评论编辑答案。

@ OP-如果您无法将响应值分配给变量,可以尝试添加匿名函数以异步方式使用它。

我不确定您希望如何在组件上使用它,但现在您的变量应该具有响应值。另一种方法是将订户移动到您的组件(虽然我不确定您的要求是什么)

编辑我之前的响应以添加anon功能。

this.getPrivateLessons().subscribe(response => {
      this.filteredPrivateLessons = res;
   },
   () => {
        console.log(this.filteredPrivateLessons);
    });
}

getPrivateLessons() : any {
   return this._http.get(this._privateLessonsUrl)
      .map( (response: Response) => response.json() );    
}