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

Replicar linhas de uma tabela com Angular

Boa noite, tudo bom?

Estou com uma dúvida acredito que bastante iniciante. Gostaria de saber como posso fazer em Angular para replicar uma linha de uma tabela. Segue um código de exemplo cujo o objetivo seria clicar no botão e adicionar mais uma linha contendo todo o conteúdo da td.

<html>
<header> Teste </header>
<body>
<table>
    <tr>
        <td>
            <label> Nome:</label>
            <input type="text" id="fname">
            <button id="Adicionar"> Adicionar nome </button>
        </td>
    </tr>
</table>
</body>
</html>
3 respostas
solução!

Olá, Bianca! Tudo bom, e aí?

Você pode usar a diretiva NgForOf. Diretivas são soluções do Angular que adicionam comportamento para elementos.

No caso da NgForOf, baseada em uma coleção (geralmente uma array), o componente é replicado para cada elemento da coleção. Você pode usá-la com *ngFor, como abaixo:

        <td *ngFor="let linha of linhas">
            <label> Nome:</label>
            <input type="text" id="fname">
            <button id="Adicionar"> Adicionar nome </button>
        </td>

O que estamos fazendo: para cada item da array linhas, que decidimos chamar de linha, crie essa <td>. Vamos olhar mais a fundo na sintaxe:

<td *ngFor="let <nome-do-item> of <nome-da-array> >

O <nome-do-item> você define no momento da criação do ngFor, isso é útil para caso você queira referenciar esse item, por exemplo:

        <td *ngFor="let linha of linhas">
            <p>{{ linha.valor }}</p>
        </td>

Nesse caso, teríamos uma array (definida no nosso .component.ts) chamada linhas, e para trabalhar com cada item, vamos chamar o item do loop de linha. Cada item da array possui uma propriedade valor ({ valor: 'algum valor' }) e para extrair o conteúdo dessa variável para o HTML usamos o {{ }}.

Note que, para isso funcionar, você precisa passar uma array que exista no .component.ts.

Certo, agora para o comportamento de replicação:

No Angular, podemos escutar eventos com (<nome-do-evento>), por exemplo, se quisermos escutar um click, podemos usar (click), e com base nisso executar um método do componente.

        <td *ngFor="let linha of linhas">
            <label> Nome:</label>
            <input type="text" id="fname">
            <button id="Adicionar" (click)="addNome()"> Adicionar nome </button>
        </td>

De novo, esse método precisa existir no componente. O método em si precisa adicionar um item na array que o ngFor usa. O componente ficará assim:

export class AppComponent {

  linhas = ['']; // precisamos adicionar uma string vazia, porque se inicializarmos a array vazia, o elemento não será apresentado

  addNome() {
    this.linhas.push(''); // adicionamos uma string vazia
  }
}

Atenção: Para usar a diretiva ngFor, você precisa ter importado o módulo CommonModule no módulo do seu componente.

Espero ter ajudado!

Boa tarde Leonardo,

Muitíssimo obrigada pelo seu apoio! Fiz alguns testes aqui com o seu código e deu tudo certo. Um novo ponto que fiquei com um pouco de dúvida é que ao replicar dessa maneira, o comportamento está sendo totalmente copiado. Por exemplo: se eu seleciono uma comboBox com a opção A na primeira tabela, a tabela replicada seleciona esse valor também automaticamente. Você sabe alguma maneira de tornar o comportamento das tabelas replicadas totalmente independentes?

Desde já agradeço muuuito seu apoio

Olá, Bianca!

Poderia compartilhar o código para que fique mais claro?

Provavelmente ambos os elementos estão sincronizando o mesmo valor. Não sei dizer ao certo sem o código, mas provavelmente você precisa ter valores separados, cada um referente a um elemento.