angular - p-dropdown no muestra la etiqueta correcta cuando la variable ngModel es un objeto
Estoy usando el componente p-dropdown de PrimeNG. Cuando la página se carga inicialmente, estoy configurando el ng-model, pero el desplegable siempre muestra el primer elemento como el elemento seleccionado.
HTML
<p-dropdown [options]="cities" [(ngModel)]="selectedCity" optionLabel="name" [showClear]="true"></p-dropdown>
<p>Selected City: {{selectedCity ? selectedCity.name : 'none'}}</p>
TS
this.cities = [
{label:'New York', value:{id:1, name: 'New York', code: 'NY'}},
{label:'Rome', value:{id:2, name: 'Rome', code: 'RM'}},
{label:'London', value:{id:3, name: 'London', code: 'LDN'}},
{label:'Istanbul', value:{id:4, name: 'Istanbul', code: 'IST'}},
{label:'Paris', value:{id:5, name: 'Paris', code: 'PRS'}}
];
Aquí New York se muestra como la opción seleccionada en el desplegable incluso si cambio el ng-model a otra ciudad.
Respuesta #1
Creo que tu problema está en optionLabel="name" porque tu objeto ciudad no contiene una clave name.
O bien lo reemplazas con optionLabel="label" o cambias tu objeto de ciudad de
{label:'New York', value:{id:1, name: 'New York', code: 'NY'}}
a
{name:'New York', value:{id:1, name: 'New York', code: 'NY'}}
Ver StackBlitz
Respuesta #2
Usé un servicio para inyectar las opciones desde mi backend (Versión que falla):
<p-dropdown
class="mt-2"
[options]="this.groupOptions"
[(ngModel)]="this.selectedOption"
[loading]="isLoading"
placeholder="Choose a usergroup to activate" />
El groupOptions se inicializó en el constructor:
constructor(private _backendService: SomeControllerService) {
this._backendService.getAllUserGroups().subscribe(groups => {
this.groupOptions = [];
groups.forEach(g =>
this.groupOptions!.push({
label: g.name??"Error",
value: g.id??-1
}));
});
}
El problema es que los datos se cargan demasiado tarde y primeng no puede construir el desplegable correctamente. Entonces encontré esta simple directiva en la API de primeNg que resolvió mi problema como por arte de magia (carga).
Versión Fija:
<p-dropdown
class="mt-2"
[options]="this.groupOptions"
[(ngModel)]="this.selectedOption"
[loading]="isLoading"
placeholder="Choose a usergroup to activate" />
Solo se necesita actualizar la variable:
isLoading: boolean = true;
constructor(private _backendService: SomeControllerService) {
this._backendService.getAllUserGroups().subscribe(groups => {
this.groupOptions = [];
groups.forEach(g =>
this.groupOptions!.push({
label: g.name??"Error",
value: g.id??-1
}));
isLoading: boolean = false;
});
}
