1
resposta

Ajuda com chamadas para método dentro do html angular

Por gentileza, gostaria de uma força para resolver um problema.

Estou usando o componente P-TABLE do PRIMENG para listar os resultados na tela, porém para cada linha eu preciso acessar uma API para verificar se os dados daquela linha podem ser alterados, então estou usando o seguinte código abaixo, note que estou fazendo uma chamada para para o método onIsDisabled que contém a chamada para minha API:

<p-table [value]="retornoPesquisa"
[(selection)]="selecaoDocumentos"
[showCurrentPageReport]="true"
dataKey="idDocumento"
[selectionPageOnly]="true"
[tableStyle]="{'min-width': '50rem'}">
<ng-template pTemplate="header">
   <tr>
      <th style="width: 4rem" width="5%">
         <p-tableHeaderCheckbox></p-tableHeaderCheckbox>
      </th>
      <th style="min-width:200px" width="10%">NOME</th>
   </tr>
</ng-template>
<ng-template pTemplate="body" let-retorno>
   <tr>
      <td>
         <p-tableCheckbox [value]="retorno" [disabled]="retorno.bloquear || retorno.action !== ''"></p-tableCheckbox>
      </td>
      <td>{{ onIsDisabled(retorno) }}
         {{retorno.nome}}
      </td>
   </tr>
</ng-template>
</p-table>


onIsDisabled(row: any) :void {
    this.service.verificarStatus(row.id).subscribe({
      next: (retorno) => {
        row.bloquear = retorno.bloquear
      },
      error: (error) => { console.log(error) },
      complete: () => { console.log('Observable completado') }
    });
  }

O problema de se fazer assim é que o método onIsDisabled fica sendo chamado até dar erro net::ERR_INSUFFICIENT_RESOURCES

Como eu posso resolver esse problema?

1 resposta

E aí, blz? Vamos lá!

O problema é que você está chamando a API várias vezes para cada linha da tabela, certo? Isso pode sobrecarregar o navegador e causar esse erro net::ERR_INSUFFICIENT_RESOURCES.

Uma solução seria fazer um pré-carregamento das informações necessárias para todas as linhas de uma vez, em vez de fazer uma chamada para cada linha individualmente.

Antes de exibir a tabela, faça uma chamada para a API para verificar o status de todas as linhas de uma vez. Assim, você terá todas as informações necessárias e não precisará fazer chamadas individuais durante a renderização da tabela.

Se não for possível fazer o carregamento antecipado, considere usar algum tipo de cache. Por exemplo, salve o resultado da API em um objeto e verifique esse objeto antes de fazer uma nova chamada. Se os dados já estiverem no cache, use-os em vez de fazer uma nova chamada.

Se sua tabela tiver muitas linhas e você não precisar verificar o status de todas elas imediatamente, considere usar o conceito de "lazy loading". Carregue apenas as linhas visíveis ou as que o usuário interagirá e verifique o status conforme necessário.

Se você realmente precisa fazer chamadas individuais para cada linha, considere usar técnicas como debounce ou throttle para limitar a frequência dessas chamadas. Isso pode ajudar a evitar sobrecargas desnecessárias.

Espero que uma dessas sugestões ajude a resolver seu problema!