Angular-HttpClient: сопоставление объекта со свойствами массива

Я вызываю API, который возвращает мне объект JSON. Мне нужно сопоставить этот объект с массивом.

Ниже приведен мой код, но после вызова API я не получаю ни ответа, ни ошибки.

export class Features {
  MenuId: number;
  MenuName: string;
  Description: string;
  RoutePath: string;
}

featureList: Features[] = [];
 constructor(private http: HttpClient)

 getFeatureListByLoggedInUser(userID: number) { debugger;       
    return this.http.get(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID)     
      .pipe(
      map(
        (data: any[]) => {
        debugger;
        this.featureList = data;
        //return true;
      }), catchError(error => {
        debugger;
        return throwError('Something went wrong!')
      })
    );
 }

Также попробовал код ниже, но он дает мне ошибку:

Объект типа не может быть назначен типу «любой []»

 featureList: Array<any> = [];

 getFeatureListByLoggedInUser(userID: number) { debugger;  
    return this.http.get(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID)
      .subscribe(
        data => {
          debugger;
          this.featureList = data;            
      });
 }

Изменить :

 return this.http.get<Array<Features>>(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID)   
      .subscribe(
        data => {
          debugger;
          //this.featureList = data;  
      });

person Sunil Kumar    schedule 06.07.2018    source источник


Ответы (1)


Вы не возвращаетесь из.map(). Вы должны вернуть this.featureList со службы

getFeatureListByLoggedInUser(userID: number) { debugger;       
    return this.http.get(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID)     
      .pipe(
      map(
        (data: any[]) => {
        debugger;
       return this.featureList = data;
      }), catchError(error => {
        debugger;
        return throwError('Something went wrong!')
      })
    );
 }

РЕДАКТИРОВАТЬ

Также map кажется ненужным в вашем коде, потому что вы ничего там не манипулируете внутри. Вы можете снять это и оставить catchError для обработки ошибок.

getFeatureListByLoggedInUser(userID: number) {       
    return this.http.get(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID)     
      .pipe(
           catchError(error => {
            return throwError('Something went wrong!')
      })
    );
 }

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

this.service.getFeatureListByLoggedInUser(id)
      .subscribe(data => { this.featureList = data })
person Amit Chigadani    schedule 06.07.2018
comment
Что возвращает http.get(). Возвращает ли он какие-либо данные? Можете ли вы проверить вкладку сети? - person Amit Chigadani; 06.07.2018
comment
не вызывая API, но со вторым кодом, упомянутым в вопросе, он вызывает API и возвращает json с тем же URL-адресом API. - person Sunil Kumar; 06.07.2018
comment
должен ли это быть http-вызов вместо httpclient на случай сопоставления объекта? - person Sunil Kumar; 06.07.2018
comment
Нет, это не должно иметь значения. Http использовался в более ранних версиях angular/ Обе функции одинаковы. - person Amit Chigadani; 06.07.2018
comment
@SunilKumar Просто удалите это свойство featureList вашего сервиса. Это бесполезно и неправильно. И удалите эту карту(), которая неверна и не сделает ничего полезного, если ее сделать правильной. И этот catchError, который скрывает существующую ошибку за другой, которая не говорит ничего полезного. Определите тип для фактического типа элементов вместо использования любого. Тогда все, что вам нужно, это: return this.http.get<Array<TheActualTypeOfTheElements>>(this.myAppUrl + "api/Employee/GetMenusByUID/" + userID); - person JB Nizet; 06.07.2018
comment
должен ли я попытаться вернуть this.http.get‹Array‹Features››(this.myAppUrl + api/Employee/GetMenusByUID/ + userID);?? @JBNizet - person Sunil Kumar; 06.07.2018
comment
Да Как сказал @JBNizet, карта кажется ненужной, потому что вы ничего не манипулируете там внутри. - person Amit Chigadani; 06.07.2018
comment
Да, это то, что я только что сказал. За исключением того, что интерфейс, вероятно, должен называться Feature, а не Features: экземпляр этого класса является одной функцией. - person JB Nizet; 06.07.2018
comment
Я не могу вызвать API без подписки @JBNizet, я также добавил это в вопрос (в редакции), все еще есть, как сопоставить ?? - person Sunil Kumar; 06.07.2018
comment
Служба не должна не подписываться. Компонент, вызывающий службу, должен это сделать. Ваш код показывает, что полученный вами ответ является нужным вам массивом. Так что картировать нечего. - person JB Nizet; 06.07.2018
comment
Вместо этого вы должны подписаться внутри вашего компонента this.service.getFeatureListByLoggedInUser(id).subscribe(data => { this.featureList = data }) - person Amit Chigadani; 06.07.2018