4
respostas

[Listagem] *ngIf="mensagem.length" -> self.context.mensagem is undefined

listagem.component.html

<p *ngIf="mensagem.length" class="alert alert-info">{{mensagem}}</p>

listagem.component.ts

import { Component } from '@angular/core';
import { FotoService } from '../foto/foto.service';
import { FotoComponent } from '../foto/foto.component';

@Component({
    moduleId: module.id,
    selector: 'listagem',
    templateUrl: './listagem.component.html'
})
export class ListagemComponent {

    service: FotoService;

    fotos: FotoComponent[] = [];

    mensagem: string;

    constructor(service: FotoService) {
        this.service = service;

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

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

resultado:

EXCEPTION: Uncaught (in promise): Error: Error in http://localhost:3000/app/listagem/listagem.component.html:7:5 caused by: self.context.mensagem is undefined

Quando removo ngIf, a mensagem é preechida corretamente após clicar no botão 'remover'.

4 respostas

Após dar um tempo, resolvi olhar o video novamente e identifiquei a causa, não incializei a mensagem na listagem.component.ts.

Após trocar

mensagem: string

por

mensagem: string = '';

tudo funcionou \o/

mas ficou a dúvida,

Por que undefined?

Fala ai Williams, tudo bem ?

Quando a gente não fala nada, não passa nem um valor ele se torna undefined, é o comportamento padrão do mundo web.

Não sei você sabe Java, mas seria semelhante a usarmos uma referencia nula.

Olá Matheus,

No caso eu defini o atributo mensagem, porém não inicializei, como defini o tipo como string, ao executar o mensagem.length o retorno deveria ter sido 0.

Interpretei errado a forma como o Angular/Typescript trata a informação no template?

É preciso inicializar o valor. O tipo apenas indica o tipo do valor, não o seu conteúdo, que será indefined caso não seja definido. Está é a causa do erro.