Невозможно получить доступ к данным из файла JSON в приложении Angular с использованием служб Angular

#json #angular #typescript #rxjs #angular-services

#json #angular #typescript #rxjs #angular-services

Вопрос:

Это мой файл JSON.

{mood: [ {

     "id":"1",
    "text": "Annoyed",
    "cols": 1, 
    "rows": 2, 
    "color": "lightgreen",
    "route":"/angry",

    "musics": [
      {
          "id": "0",
          "name": "English- Heaven's Peace",
          "image": "images/music.png",
          "link": "https://www.youtube.com/playlist?list=PLPfXrbtn3EgleopO8DiEdsNKgqYZZSEKF",
          "descpription": "Tunes that soothe your pained soul",
          "reviews": [
              {                   
                   "name": "abc",
                   "rating": 4,
                   "review": "energetic",
                   "date": ""
              }
          ]
      },
      {
           "id": "1",
           "name": "English- Hell's Fire",
           "image": "images/music.png",
           "link": "https://www.youtube.com/playlist?list=PLPfXrbtn3EgmZitRQf1X1iYwWW_nUF44L",
           "descpription": "Beats that match the ones of your heart",
           "reviews": [
               {                   
                    "name": "abc",
                    "rating": 3.5,
                    "review": "energetic",
                    "date": ""
               }
           ]
      },
      {
           "id": "2",
           "name": "Hindi",
           "image": "images/music.png",
           "link": "",
           "descpription": "",
           "reviews": [
               {                   
                    "name": "abc",
                    "rating": 4,
                    "review": "energetic",
                    "date": ""
               }            
           ]     
      },
      {
           "id": "3",
           "name": "Punjabi",
           "image": "images/music.png",
           "link": "https://www.youtube.com/playlist?list=PLPfXrbtn3Egnntch2thUO55YqPQgo4Qh7",
           "descpription": "",
           "reviews": [
               {                   
                    "name": "abc",
                    "rating": 4,
                    "review": "energetic",
                    "date": ""
               }            
           ]     
      },
      {
           "id": "4",
           "name": "Mix and Match",
           "image": "images/music.png",
           "link": "https://www.youtube.com/playlist?list=PLPfXrbtn3EglN5LVTETqH3ipRLfXmY6MB",
           "descpription": "",
           "reviews": [
               {                   
                    "name": "abc",
                    "rating": 5,
                    "review": "energetic",
                    "date": ""
               }            
           ]     
      }
   ]
}  ]
}`
  

Я создал службы angular с именем файла mood.services.ts

 import { Injectable } from '@angular/core';
import { Mood } from '../shared/mood';
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
import { map, catchError } from 'rxjs/operators';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { baseURL } from '../shared/baseurl';
import { ProcessHTTPMsgService } from './process-httpmsg.service';
@Injectable({
providedIn: 'root'
})
export class MoodService {

constructor(private http: HttpClient,
private processHTTPMsgService: ProcessHTTPMsgService) { }

getMoods(): Observable<Mood[]> {
  return this.http.get<Mood[]>(baseURL   'moods')
  .pipe(catchError(this.processHTTPMsgService.handleError));
}

getMood(id: number): Observable<Mood> {
  return this.http.get<Mood>(baseURL 'moods/' id)
  .pipe(catchError(this.processHTTPMsgService.handleError));
}

getMoodIds(): Observable<number[] | any> {
  return this.getMoods().pipe(map(moods => moods.map(mood => mood.id)))
  .pipe(catchError(error => error));
}

getMusicIds(): Observable<number[] | any> {
  return this.getMoods().pipe(map(musics => musics.map(music => music.id)))
}
}
  

И это мой файл musicdetail.component.ts, который будет извлекать данные конкретной выбранной музыки.

 import { Component, OnInit, Inject } from '@angular/core';
import { Mood } from '../shared/mood';
import { Music } from '../shared/music';
import { Review } from '../shared/review';
import { MoodService } from '../services/mood.service';
import { Params, ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { switchMap } from 'rxjs/operators';

@Component({
selector: 'app-musicdetail',
templateUrl: './musicdetail.component.html',
styleUrls: ['./musicdetail.component.scss']
})
export class MusicdetailComponent implements OnInit {

mood : Mood;
music: Music;
musicIds: string;
errMess: string;
prev : string;
next : string;
review: Review;

constructor(private moodservice: MoodService,
private route: ActivatedRoute,
private location: Location,
@Inject('BaseURL') private BaseURL) { }

ngOnInit(): void {
this.route.params.pipe(switchMap((params: Params) => {return this.moodservice.getMood(params['id']); 
}))
.subscribe(mood => {this.mood = mood;}, errmess => this.errMess = <any>errmess);
}

}
  

Я прошел оба mood.id и music.id при нажатии в music.component.ts с помощью ‘[routerLink]=»[‘/musicdetails’, mood.id , music.id ]»`, в списке музыки, но я не могу использовать логику для извлечения конкретной музыки, чтобы отобразить все ее детали. Я могу получить идентификатор настроения с помощью сервиса getMood (id), но не могу сделать то же самое для музыки внутри этого настроения.

Ответ №1:

Вы имеете в виду это?

 getMusic(moodId: number, musicId: number): Observable<Music> {
  return this.getMood(moodId).pipe(
    map(mood => mood.musics.find(music => music.id == musicId)),
    // please note: not === since id is a string in your json, but a number param
  );
}
  

Комментарии:

1. Спасибо @MoxxiManagarm, похоже, это то, что мне нужно. Я попытаюсь связаться с вами позже. Но как я могу использовать это в моем файле musicdetails.component.ts? Поскольку musicid также находится в параметрах. Например: localhost:3000/dishdetails/1/2 где ‘1’ — это moodID, а 2 — это MusicID. Логику получения moodID из параметров я уже реализовал.

2. конечно, просто получите оба параметра из route и передайте их службе

3. Хорошо, я постараюсь заставить это работать и свяжусь с вами, если мне понадобится дополнительная помощь. Большое спасибо. Приветствия.

4. Я использовал этот код в musicdetail.component.ts : this.route.params.pipe(switchMap((params: Params) => {return this.moodservice.getMusic(params['id'], params['id']); })) .subscribe(music => {this.music = music;}, errmess => this.errMess = <any>errmess); Предоставленная вами служба работала, но каждый раз, когда я выбираю музыку, она изменяет moodID, а не MusicID. Я имею в виду, что moodID меняется при выборе музыки, но MusicID исправлен. Я предполагаю, что параметры неправильно извлечены из приведенного выше кода.