angular / angular/components

Autocomplete should always handle display value and model separately

Offen
#14,086 4 Kommentare 21 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
area: material/autocomplete feature needs: discussion P3
Vorherrschende Sprache
TypeScript
Sterne
25k
Forks
6.8k
Ø Merge
1 T. 8 Std.
Gemergte PRs (30 T.)
91

Beschreibung

#### 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?

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit dem Abschnitt „setting separate control and display values“ der Autocomplete-Übersicht und dem Einstiegspunkt für mat-autocomplete, einschließlich des Verhaltens von displayWith und ngModel. Kläre die vorgeschlagene API und ihre Kompatibilität mit Angular 7, bevor du etwas änderst; als abgeschlossen sollte gelten, dass die ausgewählte Option als Zeichenkette angezeigt wird, während der gebundene Textwert eine Zeichenkette bleibt und das dokumentierte Verhalten intuitiv verständlich gemacht wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
angular, typescript
Bereich
frontend
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.