Фильтрация вложенных данных в Angular 2 - PullRequest
0 голосов
/ 11 мая 2018

У меня много взаимосвязей между книгами и категориями, и я хочу отфильтровать книги по категориям. Что мне здесь не хватает? потому что он возвращает нефильтрованные книги.

ngOnInit(): void {
this.bookService.getBooks()
  .subscribe(
  books => {
    this.filteredBooks = books.filter(
      book => book.categories.filter(cat => cat.categoryId === this.route.snapshot.params['categoryId']));

    this.route.params.subscribe(params => {
      this.categoryId = params['categoryId'];
      this.updateList();
    });
  });
  }

updateList() {
    if (this.categoryId > 0) {
      this.books = this.filteredBooks;
    }
  }

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

С моей точки зрения, этот код действительно плох и полон риска, когда вы делаете такой код.

Во-первых, вы подписываетесь два раза, и это нехорошо, поскольку вы должны отменить подписку позже.

Во-вторых, this.route.snapshot.params['categoryId'] трудно контролировать выход.

В-третьих, это слишком сложно понять this.categoryId = params['categoryId']; и this.route.snapshot.params['categoryId']. Это как дублированный код, не так ли?

Итак, я предлагаю вам попытаться использовать контейнер предсказуемого состояния , такой как Redux , для лучшей реализации программ.

Вернемся к вашей проблеме. Я думаю, коренная причина этого метода. Вы это проверяли?

updateList() {
    if (this.categoryId > 0) { // maybe this is false ???
      this.books = this.filteredBooks;
    }
}
0 голосов
/ 11 мая 2018

Попробуйте использовать find во втором поиске

this.filteredBooks = books.filter(
      book => book.categories.find(
       cat => cat.categoryId === this.route.snapshot.params['categoryId']
      ) != undefined);
...