Pesquisa de site

angular - Itens de exibição e itens selecionados do multiseleção (p-multiselect)


Estou tendo problemas para exibir os itens atualmente selecionados (sempre retorna em branco) - provavelmente não estou percorrendo o objeto corretamente. No entanto, não tenho certeza sobre a melhor abordagem para isso. Tudo o que quero é que todas as opções sejam exibidas no multi-select e também os itens atualmente selecionados (por exemplo, do banco de dados).

Componente :

orders: any[] = [];

this.orderDetailService.getAllOrders().subscribe((orders) => {
  this.orders = orders;
});


private fetchOrderDetailData() {
  if (this.orderDetailId !== undefined) {
    this.orderDetailService.getOrderDetailById(this.orderDetailId).subscribe((orderDetail) => {
      console.log(orderDetail.DetailCategories);
      this.orderDetail = orderDetail;
    });
  } else {
    // Handle the case where this.order.OrderDetail?.Id is undefined
    console.error('OrderDetail Id is undefined');
  }
}


HTML :

<div>
    <p-multiSelect [options]="categories" [(ngModel)]="selectedCategories" defaultLabel="Select a Category" optionLabel="Name"
        display="chip"></p-multiSelect>
</div>

Atualmente :

  • Capaz de exibir todas as opções
  • NÃO mostra os itens atualmente selecionados (o que eu quero)
  • Eventualmente, precisarei adicionar/remover estes

O console.log(orderDetail.DetailCategories); é aquele que exibe os itens atualmente selecionados e é um array de objetos. Array [ {…}, {…} ]. Além disso, o Category.Name é o que eu coloco como option.Label, mas para o array acima ele é chamado de CategoryName (então não é possível referenciar Name para esse).

Editar 1

Comportamento replicado:

https://primeng-multiselect-demo-cjrvx6.stackblitz.io

Observe que:

  • Eu já tenho uma cidade que não é exibida por padrão no multiseleção. Se eu então escolher uma opção, você pode ver o valor selecionado, exceto que está vazio.

  • Observe também que eu tenho uma convenção de nomenclatura diferente entre cidades e cidades selecionadas

O que eu quero é mostrar todas as cidades selecionadas por padrão junto com todas as outras opções (como uma chip no multiselecionável). Claro, com o nome da cidade. Eu terei a funcionalidade de adicionar/remover estas.

A razão para nomes diferentes é que meu projeto tem um relacionamento muitos para muitos com

  • Entidade de Categorias para listar essas opções
  • Tabela de junção OrderCategories para combinar os dois
  • Entidade de Pedido contendo uma coleção de todas as entradas da tabela de junção

Resposta #1

Se você tiver diferentes tipos de dados nos itens selecionados e na lista de opções disponíveis, você pode usar optionValue para definir uma propriedade da lista como o ID, e no [(ngModel)], você pode passar um array desses IDs.

<!-- template -->
<p-multiSelect [options]="cities" 
    [(ngModel)]="selectedCities" 
    defaultLabel="Select a City" 
    optionLabel="CityName"
    optionValue="CityCode" 
    display="chip">

// component
cities = [
    { CityName: 'New York', CityCode: 'NY' },
    { CityName: 'Rome', CityCode: 'RM' },
    { CityName: 'London', CityCode: 'LDN' },
    { CityName: 'Istanbul', CityCode: 'IST' },
    { CityName: 'Paris', CityCode: 'PRS' },
];
selectedCities = ['NY', 'RM'];

Exemplo: https://stackblitz.com/edit/primeng-multiselect-demo-nnashy?file=src%2Fapp%2Fapp.component.html

Resposta #2

Eu honestamente tentei entender a essência da pergunta relendo o texto várias vezes... Mas, infelizmente, o significado me escapa XD.

Vou tentar sugerir uma ideia baseada no uso do MultiSelect.

Os seguintes atributos são necessários para a operação básica do MultiSelect:

  • Input() opções: qualquer[]
  • Valor - ngModel ou formControl
  • se você usar Objeto(s) como opções:

    • optionLabel - chave da chave do rótulo no Objeto
    • optionValue - chave do valor na chave do Objeto

Na prática, eu uso todo Objeto como valor (não uso optionValue).


Eu voltarei ao seu exemplo.

opções <= categorias - Onde você preenche essa variável? valor <= categoriasSelecionadas - Onde você retorna essa variável?

Mby aqui devem haver pedidos como opções?