0
votes

Contrôle d'entrée en angulaire: entrée non valide non détectée

J'utilise angulaire 8 pour mon application client. Je veux qu'un message d'erreur soit affiché dans la zone d'entrée de l'utilisateur lorsqu'elle insère une mauvaise entrée. J'utilise cela dans mon HTML: xxx

Je m'attendrais à ce qu'il soit affiché si l'utilisateur devait entrer "asdf" par exemple au lieu d'un numéro comme "6.7". Mais ça ne semble jamais. J'ai essayé de supprimer [caché] = "score.valid" et il est correctement affiché. Pourquoi l'angulaire compte-t-il une entrée "asdf" une entrée valide même si je définis tous ces attributs: type = "numéro" min = "0,0" max = "10,0" 10.0 "?


8 commentaires

Si le type d'entrée est numéro, comment est-il possible d'entrer dans la chaîne "asdf"?


@Nicholask c'est une bonne question ... je ne sais pas! Je posterai une photo, attends!


Pourriez-vous inclure un très minimal Stackblitz plutôt que de poster une image pour la réplication?


@Nicholask: Je crois que c'est par conception. Je suis capable de saisir du texte dans n'importe laquelle des champs ici .


Je n'ai pas pu ..


S'il vous plaît voir cette Rapport de bogue 1398528 . Donc, pour par exemple, Chrome n'autorise pas les caractères non-nombres, mais Firefox fait.


@Michael D, vous avez raison. MS Edge (V80) ne permet pas. Mais Firefox autorise Alpha.


Pourquoi laisser l'utilisateur même de type lettres? Utilisez une directive E.G Ce


3 Réponses :


1
votes

Les champs de saisie du numéro de type permettent aux utilisateurs de saisir des caractères qui ne font pas partie d'un numéro. Voir ici pour plus de détails.

Je ne vois pas comment vous gérez la définition La valeur de score.valid code> variable. Cependant, il peut être obtenu en utilisant des classes pseudo CSS. P>

p>

public onKeyUp(event){
  let score = event.currentTarget.value;
  if ((score === '') || ((score.split('.')[1] || []).length > 1)) {
    this.disableSubmit = true;
  } else {
    score = Number(score);
    if ((score >= this.min) && (score <= this.max)) {
      this.disableSubmit = false;
    } else {
      this.disableSubmit = true;
    }
  }
}


5 commentaires

Merci pour votre réponse! Cela fonctionne bien, mais je ne sais pas comment désactiver le bouton "Soumettre" pour le formulaire. Avant de vérifier si le formulaire était valide comme celui-ci: Soumettre . Avec votre approche, comment puis-je faire ça?


Merci encore pour votre réponse rapide :) Je travaille en utilisant votre code comme référence actuellement. J'ai remarqué que si j'entraîne "8.7222", le message d'erreur est correctement affiché, mais le bouton n'est pas désactivé. Pourquoi?


De plus, je ne peux pas reproduire même l'affichage correct de l'erreur de message (comme cela fonctionne dans votre code) en cas de mauvaise valeur décimale. Pouvez-vous souligner avec des commentaires où se trouve cette contrainte?


"8.7222" N'a pas désactivé le bouton car nous ne vérifions pas la longueur de la partie décimale. J'ai mis à jour le code, s'il vous plaît jeter un oeil. Spécifiquement, cette partie: (score.split ('.') [1] || []). Longueur> 1 . Il échoue si la longueur de la partie décimale est supérieure à 1.


Je ne sais pas exactement pourquoi le message d'erreur n'est pas affiché correctement. Au moment où nous utilisons Validation de contrainte à Affichez le message. Je pourrais le tester à travers les grands navigateurs (sauf c.-à-dila). Plus d'infos sur la pseudo-classe: : invalide



0
votes

Pourquoi laisser le navigateur décider du comportement?
Utilisez une directive

/**
 * Credit: omeralper stackoverflow user
 * https://stackoverflow.com/questions/41465542/angular2-input-field-to-accept-only-numbers
 */
@Directive({
  selector: "[appDecimalOnly]"
})
export class DecimalOnlyDirective {
  constructor(private el: ElementRef) {}

  @HostListener("keydown", ["$event"]) onKeyDown(event) {
    let e = <KeyboardEvent>event;

    // console.log(e.keyCode)

    if (
      [46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
      // Allow: Ctrl+A
      (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+C
      (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+V
      (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) ||
      // Allow: Ctrl+X
      (e.keyCode === 88 && (e.ctrlKey || e.metaKey)) ||
      // Allow: home, end, left, right
      (e.keyCode >= 35 && e.keyCode <= 39)
    ) {
      // let it happen, don't do anything
      return;
    }
    // Ensure that it is a number and stop the keypress
    if (
      (e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) &&
      (e.keyCode < 96 || e.keyCode > 105)
    ) {
      e.preventDefault();
    }
  }
}


2 commentaires

Vraiment bien fait! Merci :) Le seul problème est que cela n'empêche pas l'utilisateur d'insérer une entrée non valide comme 12..99.0 ! Je voudrais seulement l'entrée de type x.y à autoriser :)


@ Robb1 assez facile solution ... Stackblitz.com/edit/angular-cuyP6k



0
votes

Pour une meilleure validation, vous devez utiliser FormControl dans le fichier .TS, vous pouvez également jeter un coup d'œil sur le DOC officiel https://angular.io/guide/form-validation .

FormControl plus flexible que NGModel - Vaut la peine d'essayer :) p> xxx pré>

et modifier votre modèle avec celui-ci: p>

  <div class="form-group">
    <label for="score">Score</label>
    <input type="number" class="form-control"
           placeholder="0.0 ÷ 10.0"
           min="0.0" max="10.0" step="0.1" name="score"
           id="score"
           [formControl]="scoreControl">

    <div *ngIf="score.invalid" class="alert alert-danger">
      Insert a value between 0.0 and 10.0
    </div>

   </div>


2 commentaires

Merci pour votre réponse! Malheureusement, en utilisant votre approche, je suis toujours autorisé à entrer des caractères en entrée. Peut-être que cela doit toujours faire avec le bug de Firefox?


Mis à jour ma réponse