Одна функция вызывает другую функцию без какого-либо определенного вызова c в Angular - PullRequest
0 голосов
/ 19 апреля 2020

Мне действительно нужна помощь, потому что я не знаю, почему это происходит.

У меня есть Angular веб-приложение с бэкэндом Firebase. Мой веб-приложение показывает 7 случайных товаров из коллекции продуктов в Firebase. Эти 7 случайных продуктов должны храниться так, чтобы пользователи могли видеть их на разных устройствах. Но если я назову свой метод сохранения, что-то странное происходит. Метод save вызывает метод, который генерирует 7 случайных произведений, и я не знаю почему, потому что я не называю его специально.

Вот мой код:

export class ProductComponent implements OnInit {

  schedulenumbers: ISchedule = { numbers: [] }; //Just an Object with an array of numbers in it
  length: number = 0; //lenght is needed to show or hite the list in the template
  filteredproducts: IProduct[] = [];
  numbers: number[] = []; // the numbers to filter the products

  constructor(private productservice: ProductService) {
    console.log("constructor wurde aufgerufen");
  }

  ngOnInit(): void {
    this.filteredproducts = [];
    console.log("ngOnInit was called")
    //get the numbers from the database
    this.productservice.getnumbers().subscribe(
      numbers => {
        this.numbers = numbers.numbers;
      }
    );
    //get all products from the database collection
    this.productservice.getallproducts().pipe(
      map((products) => {
        this.length = products.length;
        for (let i = 0; i < 7; i++) {
          this.filteredproducts.push(product[this.numbers[i]]);
        }
        return this.filteredproducts;
      })
    ).subscribe();
  }

  getRandomproducts(): void {
    this.filteredproducts = [];
    this.numbers = [];
    console.log("getRandomproducts was called");
    this.productservice.getallproducts().pipe(
      map(products => {
        for (let i = 0; i < 7; i++) {
          this.numbers[i] = Math.floor(Math.random() * products.length + 1)
          if (products[this.numbers[i]] == undefined) {
            i -= 1;
          }
          else {
            this.filteredproducts.push(products[this.numbers[i]]);
          }
        }
        console.log(this.numbers);
        return this.filteredproducts;
      })
    ).subscribe();
  }

  saveNumbers(): void {
    console.log("savenumbers was called")
    console.log(this.numbers);
    this.schedulenumbers.numbers = this.numbers;
    console.log(this.filteredproducts.length);
    this.productservice.updatenumbers(this.schedulenumbers);
  }

}

Вот код службы продукта:

@Injectable({
  providedIn: 'root'
})
export class ProductService {

  Productcollection: AngularFirestoreCollection<IProduct>;
  schedulenumbers: AngularFirestoreDocument<ISchedule>;
  numbers: Observable<ISchedule>
  Products$: Observable<IProduct[]>;

  constructor(private firestore: AngularFirestore, private auth: AngularFireAuth) {
    this.auth.currentUser.then(user => {
      this.productcollection = this.firestore.collection(`${user.uid}`);
      this.schedulenumbers =    this.firestore.collection(`${user.uid}`).doc("numbers")
    })
  }

  getallproducts() {
    return this.Products$ = this.Productcollection.valueChanges({ idField: 'ProductId' }).pipe(
      map(products =>
        products.filter(product => product.ProductId != 'numbers')
      )
    );

  }

  getnumbers() {
    return this.numbers = this.schedulenumbers.valueChanges();
  }

  updatenumbers(numbers: ISchedule) {
    this.schedulenumbers.update(numbers)
  }

  addrecipe(product: IProduct) {
    this.Productcollection.add(product);
  }

}

Я прикрепил картинку с консоли Firefox, которая показывает, что если я дважды нажму кнопку для метода getRandomproducts, а затем нажму кнопку для Метод saveNumbers, странно белый от метода saveNumbers, вызывается для l oop метода чисел getrandomproduct, а в массиве FilterProducts больше не только 7, но и гораздо больше товаров. Но почему?

Firefox консоль

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