Angular возвращает данные из вызова API как [Object Object], но не определен в компоненте - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над проектом и пришел к огромной точке блокировки.

Как я уже упоминал в своем вопросе, я построил dataService, но мой dataService правильно показывает ответ, но в моем компоненте он не определен.

Вот мой код для файла data.service.ts

import { Injectable, OnInit } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import {
  Http,
  Response,
  Request,
  RequestOptions,
  Headers
} from '@angular/http';


import {Observable} from 'rxjs/Observable';
import { Institution } from './institution';
import 'rxjs/Rx';

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json'})
};

@Injectable()
export class DataService {
  constructor(private http: HttpClient) { }
    institutionData: Object;
    //private http: Http;


 grabInstitutionData(): Observable<Institution[]> {
    return this.http
      .get(`http://127.0.0.1:8000/courses/api/institution/list/`)
      .map((response: Response) => {
        console.log(response);
        this.institutionData = <Institution[]>response.json();
        console.log('this is right' + this.institutionData);
        return this.institutionData;
      })
      .catch(this.handleError);
  }

private handleError(error: Response) {
  return Observable.throw(error.statusText);
}

}

И мой код для файла компонента:

import { async } from '@angular/core/testing';
import { Component, OnInit } from '@angular/core';
import { DataService } from '../data.service';
import {Http, Response} from '@angular/http';
import { HttpClient } from '@angular/common/http';
import { Institution } from '../institution';

@Component({
  selector: 'app-institutions',
  templateUrl: './institutions.component.html',
  styleUrls: ['./institutions.component.css']
})



export class InstitutionsComponent implements OnInit {
  institutionData: Object;
  _InstitutionsArray: Institution[];
  constructor(private http: Http, private dataService: DataService) { }

getInstitutions(): void {
    this.dataService.grabInstitutionData()
      .subscribe(
        resultArray => this._InstitutionsArray = resultArray,
        error => console.log("Error :: " + error)
      );
  }

  ngOnInit(): void {
    this.getInstitutions();
  }

}

Я знаю, что это связано с чем-то, относящимся к асинхронному вызову функции, но я не могу точно понять, что это будет.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 29 апреля 2018

El-Teezus, не используйте карту и не используйте json (). Когда мы используем «карту» для преобразования ответа, это не имеет смысла в вашем коде

// В нашем сервисе

grabInstitutionData(): Observable<Institution[]> {
    return this.http
      .get(`http://127.0.0.1:8000/courses/api/institution/list/`)
      .do(response:Response)=>{
        console.log(response);
        this.institutionData = <Institution[]>response;
        console.log('this is right' + this.institutionData);
       }) 
      .catch(this.handleError);
  }

Обратите внимание, что мы используем "do", чтобы сделать "что-то" с ответом, не меняя его. Да, «делать» - это проверять, ожидается ли ответ или нет, или кэшировать результат в любом случае. Смотрите также, что нам не нужно писать response.json (). HttpClient сделает это для нас.

В вашем компоненте

getInstitutions(): void {
    this.dataService.grabInstitutionData()
      .subscribe(
        (resultArray) => 
         {
           this._InstitutionsArray = resultArray
           //here you have the data
           console.log(this._Institutionsrray);
         },
        (error) => console.log("Error :: " + error)
      );
  }
...