angular / angular/components

Autocomplete should always handle display value and model separately

Abierto
#14,086 4 comentarios 21 reacciones 0 asignados Ver en GitHub
area: material/autocomplete feature needs: discussion P3
Lenguaje dominante
TypeScript
Estrellas
25k
Forks
6.8k
Merge medio
1 d 8 h
PR fusionados (30 d)
91

Descripción

#### Bug, feature request, or proposal:

Feature request / proposal

#### What is the expected behavior?

Assuming the following:

**TS**

```typescript
options = [{name: 'One'}, {name: 'Two'}];
text: string;
```

**HTML**

```html


{{option.name}}

```

I expect `text` to be of type `string` at any time. When selecting an option from the dropdown, I do not expect that value to be assigned to the input value. MatAutocomplete should provide a separate `ngModel` to be bound to. Sure, the selected option should be displayed in the input, but using a `string`. This is possible via the `[displayWith]` input of ``, but should not be an "opt-in" feature, it should be required.

#### What is the current behavior?

When you select an option, `text` is now of type `{name: string}`, because Angular Material autocomplete assigns the selected value to it.

#### What are the steps to reproduce?

#### What is the use-case or motivation for changing an existing behavior?

When you fetch search results from a backend, you're usually subscribing to `valueChanges` (if using `FormControl`) or `ngModelChange` (if using `ngModel`). You would expect such subscriptions to stream values of the same type at runtime.

In [the docs](
https://material.angular.io/components/autocomplete/overview#setting-separate-control-and-display-values), you have worked around this problem by doing the following:

```
map(value => typeof value === 'string' ? value : value.name),
```

Which works fine, but is not intuitive, and semantically awkward. The docs aren't clear about this specific semantic inconsistency which may cause users (like me) to waste some time trying to understand why typing is not preserved until realizing it's not a bug, but an intended behavior.

#### Which versions of Angular, Material, OS, TypeScript, browsers are affected?

Angular 7

#### Is there anything else we should know?

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con la sección «setting separate control and display values» de la descripción general de autocomplete y con el punto de entrada de mat-autocomplete, incluido el comportamiento de displayWith y ngModel. Aclara la API propuesta y su compatibilidad con Angular 7 antes de cambiar nada; el trabajo debería considerarse terminado cuando la opción seleccionada se muestre como una cadena, mientras que el valor de texto enlazado siga siendo una cadena, y el comportamiento documentado resulte intuitivo.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
angular, typescript
Área
frontend
Tipo de issue
Nueva funcionalidad
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.