4
respostas

Atualização de Array entre componentes

Ola boa tarde , depois de fazer o curso de Angular 6 e os execícios , estou testando meus conhecimentos em um projeto próprio.

Assim estou com uma duvida .

Meu cenário :

tenho 2 arrays .

dpCategoriaFaqD:CategoriaFaq[] = [];
dpCategoriaFaqR:CategoriaFaq[] = [];

estes 2 arrays , guardam as categorias Disponíveis e relacionadas de um artigo. trazidos da api , exibidos dentro de um table , onde o usuário pode adicionar ou remover entre as tabelas as categorias que deseja.

E tudo isso funciona perfeitamente.

Porem para não ficar um lista muito grande na pagina , resolvi implementar um componente de paginação

<cp-table [vExibeTabel]='!!vRegArtigo.CODARTIGO_FAQ'   
[vColuna]="tbCategoria" >

                        <tbody style="min-height: 100px;"> 
                            <tr class="bg-light" *ngFor="let inf of fGetTabelaCategoria(PagCatD.fGetPagina(),'D')">

                                <th scope="row">{{inf.DESCRICAO}}</th>

                                <td class="float-right">
                                        <button class="btn btn-xs btn-success btn3d   " (click)="fInsertCategoria(inf.CODCATEGORIA_FAQ)">
                                                <i class="fa fa-pencil "></i>
                                        </button>

                                </td>
                            </tr>
                    </tbody>
                </cp-table>
                <div class="  text-center alert alert-danger" *ngIf="!dpCategoriaFaqD.length>0">
                        Não exist

e registro!
                </div>
                <cp-paginacao [exibe]="true" [dpPagina]="dpCategoriaFaqD"  #PagCatD></cp-paginacao>
export class PaginacaoComponent implements OnChanges  {
     @Input() dpPagina = [];
     @Input() exibe : boolean = true;
    _dpPagina = [];
    //@Output() pagselec = new EventEmitter<string>();

    private _PaginaSelecionada = '0';

    ngOnChanges(changes: SimpleChanges): void {

         if(changes.dpPagina){

            this._dpPagina = this.fListaTabela(this.dpPagina);
         } 
    } 


    fSelecinaPag(pag){
        this._PaginaSelecionada = pag;
        //this.pagselec.emit(pag);
    }

    fGetPagina():string{
        return this._PaginaSelecionada;
    }

    fListaTabela (dp:any){
        const _dp=[];
        for (let i = 0; i < dp.length; i+=5) {
            _dp.push(dp.slice(i,i+5));
        }
        return _dp;
    }

E meu problema é que guando eu realizo um push direto do que alimenta o dp da paginação não atualiza .

Para contornar meu problema , métodos do serviço.

//metodo do componente 
      this.vAlert.success('Adicionado Categoria do Artigo com Sucesso!');
                    this.dpCategoriaFaqD = this.categoria.fRemoveCategoria(this.dpCategoriaFaqD,vCOD);
                    this.dpCategoriaFaqR = this.con.fAtualizaDp(this.dpCategoriaFaqR,this.vRegCatD);
// metodo do serviço categoria     
     fRemoveCategoria(dp,VALOR){
         var vReg = dp.filter(function(elem){
             if(elem.CODCATEGORIA_FAQ != VALOR){
                return elem;
             }
          });

          if(vReg!=undefined){
              return <CategoriaFaq> vReg;
          }

          return dp;
     }

// metodo de um serviço global que tenho utilizado paa resolver 
meu problema. 
fAtualizaDp(dp,vReg){
    var _dp = dp.filter(function(elem){
         return elem;
    });

    if(vReg!=null){
        _dp.push(vReg);
    }



    return _dp;
}

Então somente dessa maneira , eu consigo atualizar o meu da tabela e o da paginação e estes trabalharem simultaneamente.

Porem assim por mais que resolva , ta uma gambiarra e assim gostaria de saber qual seria melhor tecnica para que eu possa da um " refresh" no meu array e ele atualizar os componetes sem a necessidade dessa volta toda que eu estou dando.

4 respostas

Cara não vejo como gambiarra isso. No aprendizado tudo é válido. Você vai estar programando de um jeito hoje, amanhã você vai estar programando melhor. E o legal é quando você sozinho tem esses insight de (ah eu posso fazer mais legal assim).

Eu sou assim, quando estou programando no trabalho não me preocupo muito em como poderia fazer melhor. Deixo o meu subconsciente trabalhar pra mim e ter esses insight.

Só seria um problema se estiver demorando muito o carregamento das páginas.

Obrigado pela atenção amigo ,

Quanto a demora e performasse ainda não senti nenhuma diferença . Esta fluindo perfeitamente

Eu também sou assim na maioria das vezes tento achar a melhor solução para o código funcionar do jeito que quero sem ligar muito para elegância.

Porem a questão maior , e que eu ter que usar um filter pra montar basicamente um novo array , e nesse novo array eu inserir e remover e repassar para o array original ,

E que acho que pode ficar melhor , por um caminho bem mais elegante.

São as minhas manias de perfeição. kkkkkk

Então , acho que consegui melhorar melhor meu código.

então sempre que eu tiver que passar adicionar um elemento de um vetor a outro , e assim atualizar o componente de paginação referente ao registro das tabelas.

eu estava utilizando este método ,


//metodo do componente 
      this.vAlert.success('Adicionado Categoria do Artigo com Sucesso!');
                    this.dpCategoriaFaqD = this.categoria.fRemoveCategoria(this.dpCategoriaFaqD,vCOD);
                    this.dpCategoriaFaqR = this.con.fAtualizaDp(this.dpCategoriaFaqR,this.vRegCatD);

// metodo do serviço 
fAtualizaDp(dp,vReg){
    var _dp = dp.filter(function(elem){
         return elem;
    });

    if(vReg!=null){
        _dp.push(vReg);
    }



    return _dp;
}

Agora ao adiconar um novo registro no array

metodo componente . 
      this.vAlert.success('Adicionado Categoria do Artigo com Sucesso!');
                    this.dpCategoriaFaqD = this.categoria.fRemoveCategoria(this.dpCategoriaFaqD,vCOD);
                    this.dpCategoriaFaqR.push(this.vRegCatR);
                    this.dpCategoriaFaqR=Object.assign([], this.dpCategoriaFaqR);

desta forma eu consigo dar um "refresh" no array , sem a necessidade de eu ter que utilizar de um metodo de um serviço com sucesso total.

E tudo funciona perfeitamente.

Minha duvida agora é , existe alguma preocupação em utilizar esta tecnica?

Legal, não vejo problema nenhum em usar esta técnica. Gostei do jeito que melhorou seu código.