Tengo un mat-select donde las opciones son todos los objetos definidos en una matriz. Estoy tratando de establecer el valor predeterminado en una de las opciones, sin embargo, se deja seleccionado cuando se procesa la página.
Mi archivo mecanografiado contiene:
public options2 = [
{"id": 1, "name": "a"},
{"id": 2, "name": "b"}
]
public selected2 = this.options2[1].id;
Mi archivo HTML contiene:
<div>
<mat-select
[(value)]="selected2">
<mat-option
*ngFor="let option of options2"
value="{{ option.id }}">
{{ option.name }}
</mat-option>
</mat-select>
</div>
He intentado fijar selected2
y value
en mat-option
que tanto el objeto como su ID, y han intentado usar tanto [(value)]
y [(ngModel)]
en elmat-select
, pero ninguno está trabajando.
Estoy usando la versión de material 2.0.0-beta.10
angular
typescript
angular-material2
William Moore
fuente
fuente
compareWith
. Es más elegante.compareWith
, vea la respuesta de badis aquí stackoverflow.com/questions/47333171/…Respuestas:
Utilice un enlace para el valor en su plantilla.
debiera ser
Y en su valor seleccionado use en
ngModel
lugar devalue
.debiera ser
Código completo:
En una nota al margen a partir de la versión 2.0.0-beta.12, la selección de material ahora acepta un
mat-form-field
elemento como elemento principal, por lo que es coherente con los otros controles de entrada de material. Reemplace eldiv
elemento con elmat-form-field
elemento después de actualizar.fuente
mat-form-field
esto..."used to wrap several Angular Material components and apply common Text field styles"
, no es lo mismo. Aparte de que el OP y también mi respuesta no hizo menciónFormControl
,FormGroup
oFormControlName
.[compareWith]
directiva es lo que usamosUtilice
compareWith
, una función para comparar los valores de las opciones con los valores seleccionados. ver aquí: https://material.angular.io/components/select/api#MatSelectPara un objeto de la siguiente estructura:
Defina el marcado como este:
Y defina la función de comparación como esta:
fuente
Estoy usando Angular 5 y formas reactivas con mat-select y no pude obtener ninguna de las soluciones anteriores para mostrar el valor inicial.
Tuve que agregar [compareWith] para lidiar con los diferentes tipos que se utilizan dentro del componente mat-select. Internamente, parece que mat-select usa una matriz para contener el valor seleccionado. Es probable que esto permita que el mismo código funcione con múltiples selecciones si ese modo está activado.
Documento de control de selección angular
Esta es mi solución:
Form Builder para inicializar el control de formulario:
Luego implemente la función compareWith en su componente:
A continuación, cree y exporte la función determineId (tuve que crear una función independiente para que mat-select pudiera usarla):
Finalmente agregue el atributo compareWith a su mat-select:
fuente
Usted debe ser vinculante como
[value]
en elmat-option
de la siguiente manera,DEMO EN VIVO
fuente
Simplemente puede implementar su propia función de comparación
[compareWith]="compareItems"
Vea también el docu . Entonces el código completo se vería así:
y en el archivo Typecript:
fuente
i1
oi2
no.Como ya se mencionó en Angular 6, el uso de ngModel en formas reactivas está en desuso (y se eliminó en Angular 7), por lo que modifiqué la plantilla y el componente de la siguiente manera.
La plantilla:
Las partes principales del componente (
onChanges
y otros detalles se omiten):Tenga en cuenta this.filter.setValue (this.selected) en
ngOnInit
arriba.Parece funcionar en Angular 6.
fuente
[compareWith]
fue genialLo hice como en estos ejemplos. Intenté establecer el valor de mat-select en el valor de una de las mat-options. Pero falló.
Mi error fue hacer [(value)] = "someNumberVariable" a una variable de tipo numérico mientras que las de mat-options eran cadenas. Incluso si tuvieran el mismo aspecto en la plantilla, no seleccionaría esa opción.
Una vez que analicé someNumberVariable en una cadena, todo estuvo totalmente bien.
Por lo tanto, parece que necesita que los valores de mat-select y mat-option no solo sean el mismo número (si está presentando números) sino que también deben ser de tipo cadena.
fuente
La solución para mí fue:
TS:
Usando objeto: {id: número, detalle: cadena}
fuente
¡Prueba esto!
fuente
Mi solución es un poco complicada y más sencilla.
Acabo de hacer uso del marcador de posición . El color predeterminado del marcador de posición de material es
light gray
. Para que parezca que la opción está seleccionada, simplemente manipulé el CSS de la siguiente manera:fuente
La vinculación o configuración del valor predeterminado funciona solo si el atributo de valor en MatSelect es comparable al atributo de valor vinculado a MatOption . Si vincula
caption
su artículo al atributo de valor del elemento mat-option , también debe establecer el elemento predeterminado en mat-select tocaption
de su artículo. Si enlazaId
su artículo a mat-option , debe enlazarid
a mat-select , no a un artículo completo, título o cualquier otro, solo el mismo campo.Pero debes hacerlo con enlace []
fuente
Seguí lo anterior con mucho cuidado y todavía no pude seleccionar el valor inicial.
La razón fue que, aunque mi valor vinculado se definió como una cadena en mecanografiado, mi API de backend estaba devolviendo un número.
La escritura suelta de Javascript simplemente cambió el tipo en tiempo de ejecución (sin error), lo que impidió la selección del valor inicial.
Componente
Modelo
La solución fue actualizar la API para devolver un valor de cadena.
fuente
Una forma muy sencilla de lograr esto es usar un
formControl
valor predeterminado, dentro de unFormGroup
(opcional) por ejemplo. Este es un ejemplo que usa un selector de unidad para una entrada de área:ts
html
fuente
Una comparación entre un número y una cadena suele ser falsa suele , por lo tanto, transfiera el valor seleccionado a una cadena dentro de ngOnInit y funcionará.
Tuve el mismo problema, llené el mat-select con una enumeración, usando
y tenía el valor de enumeración que quería seleccionar ...
Pasé algunas horas luchando con mi mente tratando de identificar por qué no estaba funcionando. Y lo hice justo después de renderizar todas las variables que se utilizan en mat-select, la colección de claves y el seleccionado ... si tiene ["0", "1", "2"] y desea seleccionar 1 ( que es un número) 1 == "1" es falso y por eso no se selecciona nada.
Entonces , la solución es convertir el valor seleccionado en una cadena dentro de ngOnInit y funcionará.
fuente
Hice esto.
Normalmente puede hacerlo
[value]="option"
, a menos que obtenga sus opciones de alguna base de datos. Creo que la demora en obtener los datos hace que no funcionen, o los objetos obtenidos son diferentes de alguna manera a pesar de que son iguales. Curiosamente, es muy probable que sea el último, ya que también lo intenté[value]="option === selected ? selected : option"
y no funcionó.fuente
TS
HTML
fuente
fuente