Ошибка при попытке применить фильтр в Typescript - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть список объектов, и я хотел отфильтровать его по заданному c строковому свойству.

 openTasks: Task[]; //Initial list
 inProgressTasks: Task[] = []; //Filtered list

getTasks(): void {
    this.activatedRoute.paramMap.subscribe(params => {
      this.projectId = +params.get('projectId');

      if (this.projectId === 0) {
        this.taskService.getTasks().subscribe(tasks => this.openTasks = tasks); 
        // HERE I ACQUIRE LIST OF OPEN TASKS
      } else {
        this.taskService.getTaskByProjectId(this.projectId).subscribe(tasks => this.openTasks = tasks);
       // HERE I ACQUIRE LIST OF OPEN TASKS
      }

      // FILTER
      this.inProgressTasks = this.openTasks.filter(task => task.state === 'IN_PROGRESS');

    });
  }

Я получил эту ошибку:

ERROR TypeError: Cannot read property 'filter' of undefined

Не могли бы вы, пожалуйста, помочь мне с этой ошибкой?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

Вероятно, у вас возникли проблемы из-за асинхронной природы c, с которой вы получаете openTasks.

Попробуйте дождаться, пока он определенно не завершится sh, прежде чем пытаться его фильтровать.

getTasks(): void {
    this.activatedRoute.paramMap.subscribe(params => {
      this.projectId = +params.get('projectId');

      if (this.projectId === 0) {
        this.taskService.getTasks().subscribe(tasks => 
            {this.openTasks = tasks},
            error => {},
            () => { this.filterTasks()}
        );         
      } 

    });
  }
filterTasks() {
    this.inProgressTasks = this.openTasks.filter(task => task.state === 'IN_PROGRESS');
}
2 голосов
/ 21 февраля 2020

this.openTasks еще не установлен. устанавливается только после this.openTasks = tasks в subscribe. это должно работать.

this.activatedRoute.paramMap.subscribe(params => {
      this.projectId = +params.get('projectId');

      if (this.projectId === 0) {
        this.taskService.getTasks()
                  .subscribe(tasks => {
                           this.openTasks = tasks;
                           // your code that requirest openTasks
                           this.inProgressTasks = this.openTasks.filter(task => task.state === 'IN_PROGRESS');
                           });
      } else {
        this.taskService.getTaskByProjectId(this.projectId)
                        .subscribe(tasks => {
                           this.openTasks = tasks
                           // your code that requirest openTasks
                           this.inProgressTasks = this.openTasks.filter(task => task.state === 'IN_PROGRESS');
                         });
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...