перезагрузка страницы делает переменную неопределенной в Angular - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть построитель колод, компонент списка колод, который показывает список колод, и когда я нажимаю на колоду, соответствующий компонент колоды загружается с использованием идентификатора колоды с маршрутизацией. Это часть сведений о колоде, где я использую route.

 ngOnInit(){
 this.decks = this.deckService.getDecks(); // this just returns the array of decks
 this.id = this.route.snapshot.params["id"];
    this.paramsSubscription = this.route.params.subscribe((params: Params) => {
      this.id = params["id"];
      console.log(this.id);
      this.deck = this.decks.find((deck) => deck.id === this.id);
      console.log("deck-detail deck", this.deck);
}

, а это app-routing.module

const appRoutes: Routes = [
  { path: '', component: CardListComponent },
  { path: 'decks', component: DeckListComponent, children: [
    { path: ':id/:deckName', component: DeckDetailsComponent }
  ] },
  { path: 'createDeck', component: CreateDeckComponent },
];
@NgModule({
  imports: [RouterModule.forRoot(appRoutes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

, поэтому URL-адрес становится примерно таким, когда я нажимаю на колода: localhost: 4200 / палубы / id / deckName. Если страница перезагружается, когда URL-адрес подобен этому, компонент детализации колоды не перезагружается вместе со страницей, и я получаю эту ошибку

TypeError: Cannot read property 'deckName' of undefined
    at DeckDetailsComponent_Template

Что я делаю неправильно? есть проблема жизненного цикла компонента? как я могу избежать колоды, которая может быть неопределенной при перезагрузке страницы?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

для информации это компонент колоды html шаблон

<div class="container">
  <div class="row">
    <div class="deck-details  " style="border:solid black">
      <!-- <img
        [src]="'../../assets/img/' + deck.deckClass + '.png'"
        alt="{{ deck.deckName }}"
        class="img-responsive"
        style="height: 200px;"
      /> -->

      <h1 contenteditable="true">{{ deck.deckName }} : {{ deck.deckClass }}</h1>
      <div *ngFor="let card of deck.deckCards; let i = index" >
        <span
      [ngClass]="{
        common: card.rarity == 'common',
        rare: card.rarity == 'rare',
        epic: card.rarity == 'epic',
        legendary: card.rarity == 'legendary'
      }"
    >
      {{ card.name }}
    </span>
    <h4 class="inlineh4">: {{ card.manaCost }} mana</h4>
    <button class="btn btn-danger" (click) = "onDeleteCard(i)" >delete</button>
       <!--  <img [src]="card.imagePath" alt="" style="height: 20px;" /> -->
      </div>
      <hr>
      <label for="deckCards">Add a Card</label>
      <form [formGroup]="addCardForm">
        <select formControlName="deckCards" id="deckCards" name="deckCards">
          <option *ngFor="let card of selectedClassCards" [ngValue]="card">
            {{ card.name }}
          </option>
        </select>
        <button (click)="onAddCard()" type="button" class="btn btn-primary">
          Add Card
        </button>
      </form>
      <hr>
      <button class="btn btn-primary"(click) = "onCardsEdit()" >Save changes</button>
    </div>
  </div>
</div>

0 голосов
/ 21 апреля 2020

это весь компонент колоды

import { Card } from "./../../card/card.model";
import { Deck } from "./../../deck/deck.model";
import { Component, OnInit, Input } from "@angular/core";
import { DeckService } from "src/app/deck/deck.service";
import { ActivatedRoute, Params, Router } from "@angular/router";
import { Subscription } from "rxjs";
import { DataStorageService } from "src/app/shared/data-storage.service";
import { CardService } from "src/app/card/card.service";
import { FormControl, FormGroup } from "@angular/forms";

@Component({
  selector: "app-deck-details",
  templateUrl: "./deck-details.component.html",
  styleUrls: ["./deck-details.component.scss"],
})
export class DeckDetailsComponent implements OnInit {
  //@Input() deck: Deck;
  paramsSubscription: Subscription;
  id: number;
  decks: Deck[];
  deck: Deck;
  cards: Card[];
  selectedClassCards: Card[];
  classes = [
    "Priest",
    "Mage",
    "Shaman",
    "Rogue",
    "Warrior",
    "Warlock",
    "Druid",
    "Paladin",
  ];
  addCardForm: FormGroup;

  constructor(
    private deckService: DeckService,
    private cardService: CardService,
    private route: ActivatedRoute,
    private dataStorageService: DataStorageService
  ) {}

  ngOnInit() {
    this.addCardForm = new FormGroup({
      deckCards: new FormControl(),
    });
    this.cards = this.cardService.getCards();
    this.decks = this.deckService.getDecks();
    this.id = this.route.snapshot.params["id"];
    this.paramsSubscription = this.route.params.subscribe((params: Params) => {
      this.id = params["id"];

      this.deck = this.decks.find((deck) => deck.id === this.id);
      console.log("deck-detail deck", this.deck);
      this.selectedClassCards = this.cards.filter(
        (card) => card.hero === this.deck.deckClass || card.hero === "Neutral"
      );
    });
  }

  onDeleteCard(i) {
    this.deckService.deleteCard(this.deck, this.deck.deckCards[i]);
    //this.deckService.cardsChanged.next(this.deck.deckCards.slice());
    console.log(this.deck);
  }
  onAddCard() {
    this.deckService.addCard(this.deck, this.addCardForm.value.deckCards);
    console.log(this.deck);
  }

  onCardsEdit() {
    this.dataStorageService.storeCards(
      this.decks.indexOf(this.deck),
      this.deck.deckCards
    );
  }

  ngOnDestroy() {
    this.paramsSubscription.unsubscribe();
  }
}

, а это DeckService

import { DataStorageService } from './../shared/data-storage.service';
import { Deck } from './deck.model';
import { Card } from '../card/card.model';
import {EventEmitter, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Subject } from 'rxjs';

@Injectable()
export class DeckService {
  deckSelected = new EventEmitter<Deck>();
  decksChanged = new Subject<Deck[]>();
  cardsChanged = new Subject<Card[]>();

  decks: Deck[] = [];
  remainingDecks: Deck[];


  constructor(/* private http: HttpClient, */ /* private dataStorageService: DataStorageService */) {}

  setDecks(decks: Deck[]) {
    this.decks = decks;
    this.decksChanged.next(this.decks.slice());
  }
  getDecks() {
    if (this.decks) {
      return this.decks.slice();
    }

}

  addCard(deck: Deck, card: Card){
    deck.deckCards.push(card);
}
  deleteCard(deck: Deck,  card: Card){
    deck.deckCards.splice( deck.deckCards.indexOf(card), 1);
  }

addNewDeck(deck: Deck){
  this.decks.push(deck);
  this.decksChanged.next(this.decks.slice());

};

deleteDeck(id: number) {
this.remainingDecks = this.decks.filter(
  deck => deck.id !== id
)
this.decks = this.remainingDecks;
this.decksChanged.next(this.decks.slice());
}

}


, и здесь я храню и выбираю колоды с базой огня и httpClient

import { DeckService } from "./../deck/deck.service";
import { CardService } from "./../card/card.service";
import { Deck } from "./../deck/deck.model";
import { Card } from "./../card/card.model";
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { map, tap } from "rxjs/operators";

@Injectable({ providedIn: "root" })
export class DataStorageService {
  constructor(private http: HttpClient, private deckService: DeckService) {}

  storeDecks() {
    const decks = this.deckService.getDecks();
    this.http
      .put("https://ang-cards.firebaseio.com/decks.json", decks)
      .subscribe((response) => {
        console.log(response);
        console.log("stored");
      });
  }
  fetchDecks() {
    return this.http
      .get<Deck[]>("https://ang-cards.firebaseio.com/decks.json")
      .subscribe((decks) => {
        decks
          ? this.deckService.setDecks(decks)
          : this.deckService.setDecks([]);
        console.log("fetching", decks);
      });
  }
  storeCards(i: number, cards: Card[]){
    this.http
    .put("https://ang-cards.firebaseio.com/decks/" + i + "/deckCards.json", cards)
    .subscribe((response) => {
      console.log(response);
      console.log("cards stored");
    });
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...