Почему моя подпись все еще не определена, когда я подписываюсь на нее? - PullRequest
0 голосов
/ 16 мая 2019

Я создаю простой Angular-интернет-магазин и отправляю данные между двумя компонентами через сервис, используя Subject и Observable.

Почему-то в моем CartComponent "элементы" не определены, почему?

Я не могу обернуть голову вокруг, я что-то упускаю из жизни?

Услуги

import { Injectable } from '@angular/core';
import { ICartItem } from '../interfaces/ICartItem';
import { Subject } from 'rxjs';
import { IMovie } from '../interfaces/IMovie';

@Injectable({
  providedIn: 'root'
})
  export class CartService {
  private cartSource = new Subject<ICartItem[]>();
  private cart: ICartItem[] = [];

  currentShoppingCart = this.cartSource.asObservable();

  constructor() {}

  addMovie(movie: IMovie) {
    let foundMovie = false;

    for (let i = 0; i < this.cart.length; i++) {
      if (movie.id === this.cart[i].movie.id) {
        this.cart[i].amount++;
        foundMovie = true;
      }
    }
    if (!foundMovie) {
    this.cart.push({movie, amount: 1});
    }
    this.cartSource.next(this.cart);
  }

  removeMovie(movie: IMovie) {
    for (let i = 0; i < this.cart.length; i++) {
      if (movie.id === this.cart[i].movie.id) {
        this.cart[i].amount--;
    } if (this.cart[i].amount < 1) {
      this.cart.splice(i, 1);
    }
  }
    this.cartSource.next(this.cart);
  }

}

Компонент

import { Component, OnInit } from '@angular/core';
import { CartService } from '../services/cart.service';
import { ICartItem } from '../interfaces/ICartItem';

@Component({
  selector: 'app-cart',
  templateUrl: './cart.component.html',
  styleUrls: ['./cart.component.scss']
})
export class CartComponent implements OnInit {
  items: ICartItem[];

  ngOnInit() {

  }

  decreaseAmount(movie) {
    this.cartservice.removeMovie(movie);
  }
  increaseAmount(movie) {
    this.cartservice.addMovie(movie);
  }

  constructor(private cartservice: CartService) {
    this.cartservice.currentShoppingCart.subscribe( cart => {
      this.items = cart;
      console.log(this.items);
   });
      //This one will be undefined
      console.log(this.items);
  }
}

Я ожидаю, что элементы будут содержать массив movie, но теперь console.log (this.items); даст мне "неопределенный".

...