3
respostas

ERROR TypeError: Cannot read property 'filter' of undefined

Estou tentando fazer meu filtro funcionar mas quando carrego, ele dá o erro ERROR TypeError: Cannot read property 'filter' of BuscarFornecedorComponent.html:9 undefined.

Dá erro no meu html na parte de invocar o filtro:

buscar-fornecedor.component.html:

<div class="col-md-6 text-center mt-3 mb-3">
    <div class="input-group h2">
        <input name="data[search]" class="form-control" id="search" type="text"         placeholder="Pesquisar" autofocus
        (keyup) = "filter = $event.target.value">
        <span class="input-group-btn">
        </span>
    </div>
</div>
<app-card-resultado [pjs] = "pjs | filtroPelaCidade: filter" ></app-card-resultado>

Meu pipe:

import { Pipe, PipeTransform } from '@angular/core';
import { PessoaJuridica } from 'src/app/pessoa/pessoa-juridica';
@Pipe({  name: 'filtroPelaCidade'})
export class FiltroPelaCidadePipe implements PipeTransform {
  transform(pjs: PessoaJuridica[], cidade: string): any {
    cidade = cidade.trim().toLowerCase();
    if (cidade) {
      return pjs.filter(pj => pj.bairro.toLowerCase().includes(cidade));
    } else {
        return pjs;
    }
  }
}

card-resultado.component.ts:

import { OnInit, Component, Input } from '@angular/core';
import { PessoaJuridica } from 'src/app/pessoa/pessoa-juridica';
import { HomeService } from '../../home.service';

@Component({
    selector: 'app-card-resultado',
    templateUrl: './card-resultado.component.html',
    styleUrls: ['./card-resultado.component.css']
})

  export class CardResultadoComponent implements OnInit {

    @Input() pjs: PessoaJuridica[] = [];

    constructor(private homeService: HomeService){ }

    ngOnInit(): void {
        this.listarFornecedores();
    }

    public listarFornecedores(){

        this.homeService.listarFornecedores().subscribe(pjs => this.pjs = pjs);
    }
}

card-resultado.component.html:

<p-table [value] = "pjs">
    <ng-template pTemplate="body" let-pj>
        <tr>
            <td>{{pj.razaoSocial}}</td>
            <td>{{pj.cidade}}</td>
            <td>{{pj.bairro}}</td>
        </tr>
    </ng-template>
</p-table>

buscar-fornecedor.component.ts:

import { Component, OnInit } from '@angular/core';
import { PessoaJuridica } from 'src/app/pessoa/pessoa-juridica';
import { ActivatedRoute, Router } from '@angular/router';

@Component({
    selector: 'app-buscar-fornecedor',
    templateUrl: './buscar-fornecedor.component.html',
    styleUrls: ['./buscar-fornecedor.component.css']
})

export class BuscarFornecedorComponent implements OnInit{

    filter: string = '';
    pjs: PessoaJuridica[] = [];
    pj: PessoaJuridica;

    constructor(private activatedRoute: ActivatedRoute, private router: Router) {

        this.router = router;
    }

    ngOnInit(): void {
        this.pjs = this.activatedRoute.snapshot.data['pjs'];
    }

}
3 respostas

Boa noite, Flávia! Como vai?

Esse erro está ocorrendo pq pjs dentro do método transform() do pipe está com valor indefinido!

O que deve estar acontecendo é que no ngOnInit() do componente BuscarFornecedorComponent, ao fazer this.pjs = this.activatedRoute.snapshot.data['pjs'], sua rota não deve ter nenhum valor para a chave [pjs] e vc acaba atribuindo o valor undefined para o atributo this.pjs. E a consequência disso é o tal erro que vc está obtendo!

Vc pode verificar se é isso que está ocorrendo fazendo um console.log(this.pjs) logo após a linha onde vc faz a atribuição this.pjs = this.activatedRoute.snapshot.data['pjs'] e ver o que é impresso!

Para saber mais: Como a própria documentação do Angular diz, fazer um pipe para filtragem é algo que deve ser feito com muita sabedoria e na maioria dos casos o melhor é não usar essa abordagem!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, minha aluna!

Fiz o que você indicou e nem apareceu nada no console do navegador.

Você poderia me ajudar a atribuir valor ao pjs?

Opa, Flavia! Posso sim tentar te ajudar!

Vc poderia compartilhar o código completo do projeto no github para eu dar uma olhada? Assim será mais fácil te ajudar!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software