Me gustaría vincular un elemento select a una lista de objetos, lo cual es bastante fácil:
@Component({
selector: 'myApp',
template: `<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
<option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
</select>`
})
export class AppComponent{
countries = [
{id: 1, name: "United States"},
{id: 2, name: "Australia"}
{id: 3, name: "Canada"},
{id: 4, name: "Brazil"},
{id: 5, name: "England"}
];
selectedValue = null;
}
En este caso, parece que selectedValue
sería un número: la identificación del elemento seleccionado.
Sin embargo, en realidad me gustaría unirme al objeto del país en sí, de modo que ese selectedValue
sea el objeto en lugar de solo la identificación. Intenté cambiar el valor de la opción así:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
Pero esto no parece funcionar. Parece colocar un objeto en mi selectedValue
, pero no el objeto que estoy esperando. Puedes ver esto en mi ejemplo Plunker .
También intenté vincular el evento de cambio para poder configurar el objeto yo mismo en función de la identificación seleccionada; sin embargo, parece que el evento de cambio se dispara antes de que se actualice el ngModel vinculado, lo que significa que no tengo acceso al valor recientemente seleccionado en ese punto.
¿Hay una manera limpia de vincular un elemento seleccionado a un objeto con Angular 2?
Respuestas:
Ejemplo de StackBlitz
NOTA: puede usar en
[ngValue]="c"
lugar de[ngValue]="c.id"
donde c es el objeto de país completo.[value]="..."
solo admite valores de cadena[ngValue]="..."
admite cualquier tipoactualizar
Si
value
es un objeto, la instancia preseleccionada debe ser idéntica a uno de los valores.Consulte también la comparación personalizada recientemente agregada https://github.com/angular/angular/issues/13268 disponible desde 4.0.0-beta.7
Cuídate si quieres acceder
this
dentrocompareFn
.fuente
selectedValue
que no seac
de (el elemento predeterminado). Un objeto diferente incluso con las mismas propiedades y valores no funciona, tiene que ser la misma instancia de objeto.Esto podría ayudar:
fuente
let
lugar de#
@ sea-kgTambién puede hacerlo sin la necesidad de usarlo
[(ngModel)]
en su<select>
etiquetaDeclara una variable en tu archivo ts
toStr = JSON.stringify;
y en tu plantilla haz esto
y luego usar
para analizar la cadena de nuevo en un objeto JavaScript válido
fuente
A mí me funcionó:
HTML de plantilla:
Agregué
(ngModelChange)="selectChange($event)"
a miselect
.En component.ts:
Necesitas agregar a
component.ts
esta función:Nota: Intento con
[select]="oneOption.id==model.myListOptions.id"
y no funciona.============= Otras formas pueden ser: =========
HTML de plantilla:
Agregué
[compareWith]="compareByOptionId
a miselect
.En component.ts:
Necesitas agregar a
component.ts
esta función:fuente
[ngModel]
y luego configurar su modelo manualmente en la devolución de llamada de cambio personalizada definida en(ngModelChange)
.En caso de que alguien esté buscando hacer lo mismo con Formularios reactivos:
Mira el ejemplo de trabajo aquí
fuente
Puede seleccionar la identificación usando una función
fuente
Para mí está funcionando así, puedes consolar
event.target.value
.fuente
Además, si nada más de las soluciones dadas no funciona, verifique si importó "FormsModule" dentro de "AppModule", esa fue una clave para mí.
fuente
Crea otro captador para el artículo seleccionado
En ts:
fuente
Puede obtener el valor seleccionado también con la ayuda de click () pasando el valor seleccionado a través de la función
fuente
use de esta manera también ...
fuente
En
app.component.html
:Y
app.component.ts
:fuente
ese enfoque siempre funcionará, sin embargo, si tiene una lista dinámica, asegúrese de cargarla antes del modelo
fuente