IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Angular Discussion :

Synchronisation incohérente de value d'inputs avec les éléments d'un tableau


Sujet :

Angular

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Synchronisation incohérente de value d'inputs avec les éléments d'un tableau
    Bonjour, je travaille actuellement sur un projet angular et je rencontre un problème surprenant. J'utilise un tableau de nombres dans un composant angular, les éléments de ce tableau sont liés à une liste d'éléments de type input grâce à un ngFor. Quand un changement de valeur est détecté dans l'un des inputs la cellule correspondante du tableau est mise-à-jour. Après vérification, les valeurs du tableau sont correctes.

    Cependant lorsque j'introduis une nouvelle valeur dans un des input, il arrive que parfois cela change la valeur d'un autre input (i.e. cette nouvelle valeur est aussi affectée à cet input). Ce comportement non-désiré se produit avec les autres inputs lorsque ceux-ci ont la même valeur initiale, il semble aussi que ce soit toujours les inputs qui se situent plus loin dans la boucle...

    Ce qui est complètement incompréhensible, c'est que si j'affiche le contenu du tableau après l'input sous la forme de simple texte cote-à-cote avec les inputs, les valeurs textuelles affichées sont correctes.

    J'ai testé le fait de mettre des noms et des ids uniques à chacun des inputs afin qu'angular puisse les distinguer... sans résutat le problème persiste.

    J'ai réussi à reproduire le problème sur un jsfiddle dont voici le lien : https://jsfiddle.net/bruno19/qab9u4fw/49/
    Le problème est immédiatement visible en changeant la 1ere value des inputs en '2', le second input prend alors la valeur '2' (même si la valeur du second élément du tableau reste 1). Le jsfiddle utilise la version 4 d'angular, mais mon projet original utilise la version 6 et le problème reste identique.

    Si quelqu'un a une idée du pourquoi de ce comportement et comment le corriger... le but étend bien entendu que les values des inputs et les valeurs des éléments du tableau soient toujours synchronisées.

    Voici le code du composant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    let { Component, NgModule, OnInit } = ng.core;
     
    @Component({
      selector: 'my-app',
      template: `
        <div *ngFor="let v of values; let i = index;" style="float: left;"><input type="text" name="input-{{i}}" [value]="v" (change)="onChange(i, $event)"/><p>{{ v }}</p></div>
      `,
    })
    class HomeComponent implements OnInit {
    	  public values: number[] = [];
    		n = 5;
        ngOnInit() {
            for(let i = 0; i < this.n; i++)
            	this.values.push(1);
        }
       onChange(i: number, event)
        {
        	this.values[i] = parseInt(event.target.value);
        }
    }
    et voici le template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <div *ngFor="let v of values; let i = index;" style="float: left;">
      <input type="text" name="input-{{i}}" [value]="v" (change)="onChange(i, $event)"/>
      <p>{{ v }}</p>
     </div>

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2017
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Salut,

    Il s'agit probablement d'un problème lié à l'event bubbling.

    J'ai une bonne nouvelle pour toi. Tu peux faire plus simple et te compliquer moins la vie.

    Tu peux utiliser le two ways data-binding, soit [(ngModel)].

    Si tu veux vraiment parser sur le (change), tu peux utiliser l'event de ngModel : (ngModelChange).

    Ps : je te donne les premieres pistes, j'éditerai mon message ultérieurement pour faire une réponse (complète)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Bonjour,

    A mon avis tu vas au devant de tas de problèmes avec Template-driven form sur ce type de formulaire.
    Ton tableau est construit dynamiquement il te faut donc utiliser les ReactiveForm et utiliser par exemple un FormArray pour stocker tes inputs.
    Cela va te permettre de mieux suivre ton modèle et d'ajouter ou d'enlever des contrôles programmatiquement.

    Bon courage,

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/03/2011, 10h01
  2. [FPDF] problème avec les images dans un tableau dynamique
    Par GADSN dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 08/04/2009, 11h11
  3. [formulaire]réafficher le même formulaire avec les éléments saisis
    Par melisse dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 05/02/2007, 16h56
  4. Problème avec les espaces dans un tableau !
    Par remixtech dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/07/2006, 19h30
  5. Problème avec les styles d'un tableau
    Par psychoBob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 20/05/2006, 03h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo