Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

erro ao excluir foto e atualizar pagina

Ao excluir uma foto e por vezes ao incluir novas fotos obtenho o seguinte erro ao atualizar a página que faz a listagem das fotos na aplicação. Aparentemente o filtro está iterando sobre um elemento não inicializado. O que pode estar acontecendo? Segui passo a passo o vídeo e codificando junto, mas estou com esse problema. Obrigado.

:3000/node_modules/@angular/core/bundles/core.umd.js:3462 EXCEPTION: Uncaught (in promise): Error: Error in http://localhost:3000/app/listagem/listagem.component.html:23:16 caused by: Cannot read property 'filter' of undefined
ErrorHandler.handleError @ :3000/node_modules/@angular/core/bundles/core.umd.js:3462
:3000/node_modules/@angular/core/bundles/core.umd.js:3467 ORIGINAL STACKTRACE:
8 respostas

Pode ficar tranquilo que mais de 500 pessoas passaram dessa parte sem problema algum.

Compartilhe seu código para que possamos ver de listagem.component.html e do seu componente ListagemComponent.

Também achei muito estranho não funcionar, mas sabe como é, as vezes o erro tá na nossa cara e não vemos. Eu ja dei continuidade a curso e concluí a segunda parte, mas o erro ainda persiste no Pipe ao excluir uma foto.

//listagem.component.ts

import {Component} from '@angular/core';
import { FotoService } from '../foto/foto.service';
import { FotoComponent } from '../foto/foto.component';
import { PainelComponent } from '../painel/painel.component';
@Component({
    moduleId:module.id,
    selector:'listagem',
    templateUrl:'./listagem.component.html'
})
export class ListagemComponent{
    fotos:FotoComponent[];
    service:FotoService;
    mensagem:string='';


    constructor(service:FotoService){
        this.service=service;
        service.lista()
        .subscribe(fotos=>{
            this.fotos=fotos;
        }, erro => console.log(erro))

    }
    remove(foto:FotoComponent,painel:PainelComponent){
        this.service
        .remove(foto)
        .subscribe( 
            ()=> {
                painel.fadeOut(()=>{
                    let novasFotos = this.fotos.slice(0);
                    let indice = novasFotos.indexOf(foto);
                    novasFotos.splice(indice,1);
                    this.fotos = novasFotos;
                    console.log('Foto removida com sucesso');
                    this.mensagem='Foto removida com sucesso'
                });
            },
            erro=>{
                console.error(erro)
                this.mensagem='Não foi possível remover a foto';
            }
        )
    }

}
//listagem.component.ts
<div class="jumbotron">
    <h1 class="text-center">Futurama</h1>
</div>
<div class="container">
    <p *ngIf="mensagem.length" class="alert alert-info">{{mensagem}}</p>
    <div class="row">
        <div class="col-md-12">
            <form>
                <div class="input-group">
                    <span class="input-group-btn">
                        <a [routerLink]="['/cadastro']" class="btn btn-primary">
                            Nova foto
                        </a>
                    </span>
                    <input #textoProcurado (keyup)="0" class="form-control" placeholder="filtrar pelo título da foto">
                </div>
            </form>
        </div>
    </div>

    <br>
    <div class="row">
        <painel #painel *ngFor="let foto  of fotos | filtroPorTitulo: textoProcurado.value" titulo="{{foto.titulo | uppercase}}" class="col-md-2">
            <a [routerLink]="['/cadastro',foto._id]">
                <foto url="{{foto.url}}" titulo="{{foto.titulo}}"></foto>
            </a>
            <botao nome="Remover" estilo="btn-danger btn-block" (acao)="remove(foto,painel)" confirmacao="true"></botao>
        </painel>
    </div>
</div>

A única forma do foto.pipe.ts não apresentar o erro de undefined é fazendo um teste antes.

//foto.pipe.ts
import {Pipe,PipeTransform} from '@angular/core'
import {FotoComponent} from './foto.component';

@Pipe({
    name:'filtroPorTitulo',

})
export class FiltroPorTitulo implements PipeTransform{
    transform(fotos: FotoComponent[],digitado: string){
        if(fotos){
            return fotos.filter(foto=>foto.titulo.toLowerCase().includes(digitado.toLowerCase()));
        }
        return fotos;
    }
}

Quando não exclui uma foto, Pipe esta funcionando, correto? Você digita e ele filtra?

Ou quando apaga todas as fotos, sem deixar nenhuma?

solução!

Meu aluno, vamos dar uma olhadinha nessa parte do código:

export class ListagemComponent{
    fotos:FotoComponent[];
    service:FotoService;
    mensagem:string='';

Veja que a lista fotos não foi inicializada. Se o Pipe aplicar antes dos dados chegarem do servidor vai dar problema. Experimente fazer:

    fotos:FotoComponent[] = [];

E veja se funciona sem o if. No entanto, o if lá não é feito não, é até bom que garante caso o desenvolvedor não tenha iniciado o valor da lista.

Aguardo seu retorno para começar o 2017 show de bola!

Sim, ele funciona corretamente, eu digito e ele filtra certinho. Não testei apagando todas as fotos, mas se excluir uma foto obtenho esse erro.

Ahhh era isso mesmo Flávio. Eu não iniciei a lista. Você é fera demais. Obrigado pela rápida ajuda.

Demorei um pouquinho para enxergar o problema, mas achei.

Olha, pode manter aquela sua estratégia do if no Pipe. Ficou bonito. Isso tira a responsabilidade do programador ter que lembrar de inicializar a lista.

A solução do seu problema foi elegante. :)

Feliz 2017 e bora estudar mais conosco!