3
votes

Comment puis-je forcer Angular 7+ Material Autocomplete à saisir des lettres uniquement fournies par une source de données?

Modifier: Il existe des solutions de contournement comme indiqué ci-dessous (voir les réponses) pour les formulaires basés sur des modèles. (Je recherche une solution pour les formulaires réactifs.)


Comment puis-je forcer la saisie semi-automatique du matériau angulaire à saisir des lettres uniquement fournies par une source de données?

>> Voir l'ensemble app ici sur stackblitz.com

"Adel" est la valeur initiale et elle est fournie par le tableau d'options:

options: User[] = [
    {name: 'George Michael'},
    {name: 'Aretha Franklin'},
    {name: 'Adel'},
    {name: 'Janet Jackson'},
  ];

L'auto -complete fonctionne correctement:

 entrez la description de l'image ici

Cependant, ce qui suit ne devrait pas être possible:

entrez description de l'image ici

L'utilisateur ne peut saisir que les lettres correspondant à une entrée de la liste, i. les premières lettres d'une entrée existante.

Si l'utilisateur tente de saisir des lettres qui ne correspondent à aucune des valeurs existantes, un message d'erreur doit informer l'utilisateur: "La valeur saisie doit correspondre à une entrée de liste".

Est-il possible de faire cela avec la saisie semi-automatique du matériau angulaire?


4 commentaires

Copie possible de Comment arrêter la saisie semi-automatique du tapis pour supprimer les valeurs d'entrée utilisateur personnalisées des options données?


@ PatrykUszyński les solutions sont trop anciennes, il doit s'agir d'un matériau angulaire et angulaire ^ 7, je vais mettre à jour le titre. Comme vous le voyez, il n'y a pas de réponses acceptées. Ne soyez pas trop zélé, merci!


Essayez ceci: github.com/angular/material2/issues/3334#issuecomment-469718‌ 514


@ PatrykUszyński Peut-être que c'est actuellement le seul moyen possible -> rédiger sa propre directive, merci. Mais la solution est pour un formulaire basé sur un modèle.


3 Réponses :


1
votes

Il peut être plus efficace d'intercepter l'entrée de clé au moment de la saisie en ajoutant un gestionnaire de touches à l'entrée. Ensuite, regardez ce que serait la valeur et comparez-la à la liste, en «annulant» l'événement si nécessaire. En gros:

<input (keydown)="keydownHandler($event)" ...


keydownHandler(event: KeyboardEvent) {
  const character = event.key;
  if (character.length === 1) {

    let value = this.myForm.controls.myControl.value;
    if (typeof value === 'object') {
      value = value.name;
    }

    value = (value + character).toLowerCase();

    if (!this.options.some(option => option.name.toLowerCase().indexOf(value) === 0)) {
      event.preventDefault();
    }
  } 
}

Cela fonctionne avec tout type de formulaire.

Stackblitz


2 commentaires

merci, votre solution fonctionne correctement mais n'est pas conviviale. : / J'ai écrit un validateur personnalisé, pour résoudre ce problème.


pourquoi pas :) J'adorerais!



2
votes

J'ai résolu ce problème avec un validateur personnalisé. Si vous voulez le voir, ici ,. .

Dans la liste mais sensible à la casse:

 Case Sensitive

Valeur incorrecte

 Mauvaise valeur

Tout va bien

 Tout va bien


0 commentaires

0
votes

Vous pouvez également essayer la méthode suivante qui ne nécessite pas de vérifier les éléments dans la liste entière.

Sélection de force de composant de saisie semi-automatique de matériau angulaire: exemple complet < / p>

Voici le code de démonstration sur Stackblitz


0 commentaires