Angular - problem z metodą edytującą/updatującą dane

0

Cześć,
obecnie walczę z małym projekcikiem, który ma za zadanie realizować miedzy innymi funkcje CRUD. Użyłem in-memory-db do przechowywania danych, routing działa ok, w momencie kiedy przechodzę do podstrony klubu, chciałbym mieć możliwość jego usunięcia lub edytowania(w bieżącej sesji).. Usuwanie działa ok, niestety męczę się edytowaniem, więc prosiłbym o pomoc. Tak wyglądają moje serwisy i metody:

service:

export class ClubService{
    private clubUrl = 'api/clubs';

    constructor(private http: HttpClient) {}

    getClubs(): Observable<IClub[]> {
        return this.http.get<IClub[]>(this.clubUrl)
        .pipe(
            tap(data => console.log(JSON.stringify(data))),
            catchError(this.handleError)
        );
    }

    getClub(id: number): Observable<IClub> {
      if (id === 0){
        return of(this.initializeClub());
      }
      const url = `${this.clubUrl}/${id}`;
      return this.http.get<IClub>(url)
        .pipe(
          tap(data => console.log('getClub: ' + JSON.stringify(data))),
          catchError(this.handleError)
        );
    }

    createClub(club: IClub): Observable<IClub> {
      const headers = new HttpHeaders({'Content-Type': 'application/json'});
      club.id = 0;
      return this.http.post<IClub>(this.clubUrl, club, {headers})
        .pipe(
          tap(data => console.log('createClub: ' + JSON.stringify(data))),
          catchError(this.handleError)
        );
    }

    deleteClub(id: number): Observable<{}> {
      const headers = new HttpHeaders({ 'Content-Type': 'application/json'});
      const url = `${this.clubUrl}/${id}`;
      return this.http.delete<IClub>(url, {headers})
        .pipe(
          tap(data => console.log('deleteClub:' + id)),
          catchError(this.handleError)
        );
    }


    updateClub(club: IClub): Observable<IClub> {
      const headers = new HttpHeaders({'Content=Type': 'application/json'});
      const url = `${this.clubUrl}/${club.id}`;
      return this.http.put<IClub>(url, club, {headers})
        .pipe(
          tap(() => console.log('updateClub: ' + club.id + club.clubName)),
          map(() => club),
          catchError(this.handleError)
        );
    } 



    private handleError(err: HttpErrorResponse): Observable<never> {
        let errorMessage = '';
        if (err.error instanceof ErrorEvent) {
          errorMessage = `An error occurred: ${err.error.message}`;
        } else {
          errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
        }
        console.error(errorMessage);
        return throwError(errorMessage);
      }

      private initializeClub(): IClub {
        return {
          id: 0,
          clubName: "",
          clubLogoURL: ""
        };
      }
}

klasa:

export class ClubEditComponent {
    
    tabTitle: string = "Club Edit:";
    errorMessage: string ='';
    club!: IClub ;

    constructor(private route: ActivatedRoute,
        private router: Router,
        private clubService: ClubService) {}

    ngOnInit(): void {
        const param = Number(this.route.snapshot.paramMap.get('id'));
        if (param) {
            const id =+param;
          this.getClub(id);
          }
        }
    
      getClub(id: number): void {
        this.clubService.getClub(id).subscribe({
          next: club => {
            this.club = club;
          },
          error: err => this.errorMessage = err
        });
      }

      
      
      updateClub(): void {
        this.clubService.updateClub(this.club)
        .subscribe({
          next: () => this.router.navigate(['/clubs']),
          error: err => this.errorMessage = err 
      });
      } 

      deleteClub(): void {
          this.clubService.deleteClub(this.club?.id)
          .subscribe({
            next: () => this.router.navigate(['/clubs']),
            error: err => this.errorMessage = err 
        });
      }
0

Ale co Ci nie działa? Debugowałeś w API? Masz jakieś błędy w konsoli?

A najlepiej to jak odtworzysz problem w Stackblitz.

P.S. Spróbuj zmienić metodę PUT na POST i zobaczy czy będzie działało. Pamiętam, że kiedyś też się siłowałem z PUT w Angularze.

0

Nie działa mi updatowanie wartości czyli np chce zmienić nazwę klubu w przeglądarce, wpisuje coś innego i po wciśnięciu buttona dalej jest to samo co pobrał z danych. W konsoli brak jakichkolwiek błędów. Próbowałem zmiany na post, ale w dalszym ciągu brak reakcji.

0

Wnioskuję, że po wywołaniu updateClub(club: IClub) zostaje wysłane żądanie do API. Gdzie / czym jest to API? Jaką wartość przyjmuje this.clubUrl ? Czy debugowałeś, enpoint dla this.http.put<IClub>(url, club, {headers}) i czy jest w ogóle wywołany? Jak wygląda ten endpoint? Możesz wkleić jego kod?

0

IClub

export interface IClub {
    id: number;
    clubName: string;
    clubLogoURL: string;
}

tutaj trzymam moje wszystkie dane:

export class MatchData implements InMemoryDbService {

    createDb() {
        const matches: IMatch[] = [
            {
                "id": 1,
                "isMatchOfTheWeek": true,
                "matchSport": "Pilka nozna",
                "matchName": "Anglia Niemcy",
                "matchDate": "29 Czerwiec, 2021",
                "matchTime": "18:00",
                "matchHomeOdd": 2.85,
                "matchDrawOdd": 2.95,
                "matchAwayOdd": 2.75
              },
              {
                  "id": 2,
                  "isMatchOfTheWeek": false,
                  "matchSport": "Pilka nozna",
                  "matchName": "Szwajcaria Francja",
                  "matchDate": "28 Czerwiec, 2021",
                  "matchTime": "21:00",
                  "matchHomeOdd": 7.55,
                  "matchDrawOdd": 4.95,
                  "matchAwayOdd": 1.55
                },
                {
                  "id": 3,
                  "isMatchOfTheWeek": false,
                  "matchSport": "Pilka reczna",
                  "matchName": "Chorwacja Hiszpania",
                  "matchDate": "11 Lipiec, 2021",
                  "matchTime": "20:30",
                  "matchHomeOdd": 2.25,
                  "matchDrawOdd": 11.00,
                  "matchAwayOdd": 1.75
                },
                {
                  "id": 4,
                  "isMatchOfTheWeek": true,
                  "matchSport": "Koszykowka",
                  "matchName": "Atlanta_Hawks Chicago_Bulls",
                  "matchDate": "30 Czerwiec, 2021",
                  "matchTime": "04:00",
                  "matchHomeOdd": 1.85,
                  "matchDrawOdd": 20.95,
                  "matchAwayOdd": 1.75
                },
                {
                  "id": 5,
                  "isMatchOfTheWeek": false,
                  "matchSport": "Hokey",
                  "matchName": "Finlandia Rosja",
                  "matchDate": "12 Sierpien, 2021",
                  "matchTime": "17:00",
                  "matchHomeOdd": 1.85,
                  "matchDrawOdd": 6.95,
                  "matchAwayOdd": 1.98
                },
                {
                  "id": 6,
                  "isMatchOfTheWeek": true,
                  "matchSport": "siatkówka",
                  "matchName": "Polska Anglia",
                  "matchDate": "22 Lipiec, 2021",
                  "matchTime": "12:00",
                  "matchHomeOdd": 1.22,
                  "matchDrawOdd": 5.35,
                  "matchAwayOdd": 2.14
                }
        ];
        const clubs: IClub[] = [
          {
              "id": 100,
              "clubName": "Legia Warszawa",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/legia.gif"
          },
          {
              "id": 101,
              "clubName": "Lech Poznan",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/lech.gif"
          },
          {
              "id": 102,
              "clubName": "Lechia Gdansk",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/lechia_gdansk.gif"
          },
          {
              "id": 103,
              "clubName": "Pogon Szczecin",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/pogon_szczecin.gif"
          },
          {
              "id": 104,
              "clubName": "Rakow Czestochowa",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/rakow.gif"
          },
          {
              "id": 105,
              "clubName": "Wisla Krakow",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/wisla.gif"
          },
          {
              "id": 106,
              "clubName": "Zaglebie Lubin",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/zaglebie_lubin.gif"
          },
          {
              "id": 107,
              "clubName": "Radomiak Radom",
              "clubLogoURL": "http://img.90minut.pl/logo/dobazy/radomiak.gif"
          }
      ];
        return {matches, clubs};
    }
}

clubUrl

export class ClubService{
    private clubUrl = 'api/clubs';

```
Wzorowałem się na tym projekcie [https://github.com/DeborahK/Angular-ReactiveForms/tree/master/APM]
0

Ok, teraz już widzę, że jest wykorzystane InMemoryWebApiModule.forRoot(ProductData) w projekcie z linku. Ja bym pogooglał o problamach z http.put dla InMemoryWebApiModule, czy ktoś miał podobne do Twoich. Nigdy nie korzystałem z InMemoryWebApiModule i nie wiem czy powszechnie istnieją jakieś problemy z podmianą danych czy nie. A na odległość będzie ciężko mi to debugować.

Może trafi się tu ktoś bardziej rozgarnięty i będzie w stanie Ci poradzić coś więcej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1