Array de Select para salvar – javascript html5 angular

Pergunta:


Fazendo um array de selects utilizando multi-select, mas os select não estou se comunicando, quando eu seleciono um aparece no json, mas quando eu vou selecionar outro subscreve aqueles que eu selecionei.Estou utilizando Angular 4.

Segue o link abaixo para testar a função.

Staackblitz: https://stackblitz.com/edit/angular-tjgycw?file=src/app/app.component.html

JSON

inserir a descrição da imagem aqui

Component

colecaoGrupoPermissoes: ColecaoGrupoPermissao[];
this.perfilAcessoService.findAllPermissoes()
    .subscribe(colecaoGrupoPermissoes => {
        console.log(colecaoGrupoPermissoes)
        this.colecaoGrupoPermissoes = colecaoGrupoPermissoes;
    })

this.perfilAcessoForm = this.builder.group({
    id: [],
    nome: ['', [Validators.required, Validators.maxLength(120)]],
    tipoPerfil: ['', [Validators.required]],
    unidade: this.builder.group({
        id: ['', [Validators.required]]
    }),
    descricao: ['', [Validators.required, Validators.maxLength(80)]],
    permissoes: ([{}]),
}, {});

Html

   <div id="collapse{{i}}" class="accordion-body collapse" aria-expanded="false" style="">
   <div class="panel-body">
      <!-- BUTTON ADD FORMAÇÃO -->
      <div class="row">
         <div *ngFor="let grupoPermissao of colecaoGrupoPermissao.grupoPermissoes">
            <div class="col-md-6">
               <p>{{grupoPermissao.nome | translate}}</p>
            </div>
            <div class="col-md-6">
               <input-container fieldErrorCode="{{extractErrorCode('permissao')}}" fieldName="permissao">
                  <select class="form-control" formControlName="permissoes" [compareWith]="compareFn" multiple> 
                  <option *ngFor="let permissao of grupoPermissao.permissoes" [ngValue]="permissao">{{permissao.nome}}</option>
                  </select>
               </input-container>
            </div>
         </div>
      </div>
   </div>
</div>

Autor da pergunta Lucas

Resposta :

Postando resposta do stackblitz

app.module.ts

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
  @NgModule({
    declarations:[
      AppComponent,
      HelloComponent
    ],
    imports: [
      BrowserModule,
      CommonModule,
      ReactiveFormsModule,
      FormsModule,
    ],
    exports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ],
    bootstrap:[ AppComponent ],

  })
  export class AppModule {}

app.component.ts

import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup, FormControl } from '@angular/forms'

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit  {
  name = 'Angular';
  acessoForm: FormGroup;
  listaPermissoes: any[];

  constructor(
      private builder: FormBuilder,
  ){

  }

  ngOnInit(){

    this.listaPermissoes = [
    {
      "id": 2,
      "nome": "grupo.perm.cadeira",
      "permissoes": [
        {
          "id": 6,
          "nome": "perm.cadastrarCadeira"
        },
        {
          "id": 7,
          "nome": "perm.alterarCadeira"
        },
      ]
    },
    {
      "id": 4,
      "nome": "grupo.perm.mesa",
      "permissoes": [
        {
          "id": 15,
          "nome": "perm.cadastrarMesa"
        },
        {
          "id": 16,
          "nome": "perm.alterarMesa"
        },
      ]
    }]

     this.acessoForm = this.builder.group(
      this.listaPermissoes.map((item, index) => `permissoes-${index}`)
        .reduce((pre, curr) => { 
          pre[curr] = [[]]; 
          return pre; }, {}), {});
  }

  selectedPermissoes(){
    return [].concat(...Object.values(this.acessoForm.value));
  }

  test(){
    console.log(this.selectedPermissoes())
  }

  }

app.component.html

<form [formGroup]="acessoForm">
    <div *ngFor="let listaPermissao of listaPermissoes; let i = index">
        <div class="col-md-6">
            <p>{{listaPermissao.nome}}</p>
        </div>

        <div class="col-md-6">

            <select class="form-control" [formControlName]="'permissoes-'+i" multiple>
                                      <option *ngFor="let permissao of listaPermissao.permissoes" [ngValue]="permissao">{{permissao.nome}}</option>
                                    </select>
        </div>
    </div>
</form>
<pre (click)="test()">{{acessoForm.value | json}}</pre>

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *