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 :

FormArray avec FormGroup et ControlValueAccessor


Sujet :

Angular

  1. #1
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut FormArray avec FormGroup et ControlValueAccessor
    Bonjour,

    je bosse sur des formulaires assez complexe et j'ai des FormArray contenant des Formgroup que je voudrais binder grâce à des ControlValueAccessor dans les sous-composants.

    Malheureusement seul le premier composant est bindé et j'ai une erreur :
    core.js:6456 ERROR TypeError: control.registerOnChange is not a function
    at setUpModelChangePipeline (forms.js:1700)
    at setUpControl (forms.js:1530)
    at FormGroupDirective.addControl (forms.js:5224)
    at FormControlName._setUpControl (forms.js:5806)
    at FormControlName.ngOnChanges (forms.js:5751)
    at FormControlName.rememberChangeHistoryAndInvokeOnChangesHook (core.js:1498)
    at callHook (core.js:2536)
    at callHooks (core.js:2495)
    at executeInitAndCheckHooks (core.js:2446)
    at refreshView (core.js:9456)
    core.js:28040 Angular is running in development mode. Call enableProdMode() to enable production mode.
    core.js:6456 ERROR TypeError: control.registerOnChange is not a function
    at setUpModelChangePipeline (forms.js:1700)
    at setUpControl (forms.js:1530)
    at FormGroupDirective.addControl (forms.js:5224)
    at FormControlName._setUpControl (forms.js:5806)
    at FormControlName.ngOnChanges (forms.js:5751)
    at FormControlName.rememberChangeHistoryAndInvokeOnChangesHook (core.js:1498)
    at callHook (core.js:2536)
    at callHooks (core.js:2495)
    at executeInitAndCheckHooks (core.js:2446)
    at refreshView (core.js:9456)
    index.js:52 [WDS] Live Reloading enabled.
    Biazarrement si je modifie une valeur dans l'interface le deuxième se bind bien, voici un exemple de code simplifier à l'extreme

    App.component.html:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <form [formGroup]="form">
      <input type="text" formControlName="page">
      <ng-container formArrayName="users">
        <ng-container *ngFor="let item of users.controls;index as i">
          <app-form-user [formControlName]="i">
          </app-form-user>
        </ng-container>
      </ng-container>
     
    </form>
     
    {{form.value|json}}
    <!-- <router-outlet></router-outlet> -->

    le .ts
    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
    22
    import { Component } from '@angular/core';
    import { FormArray, FormControl, FormGroup } from '@angular/forms';
     
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.scss']
    })
    export class AppComponent {
      title = 'form-array';
      form = new FormGroup({
        page: new FormControl("home"),
        users: new FormArray([
          new FormGroup({ name: new FormControl("toto"), age: new FormControl(15) }),
          new FormGroup({ name: new FormControl("jaja"), age: new FormControl(25) })
        ])
      });
     
      get users(): FormArray {
        return this.form.get('users') as FormArray;
      }
    }
    mon form-user.html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form [formGroup]="formGroup">
        <input type="text" formControlName="name">
        <input type="number" formControlName="age">
    </form>

    le .ts
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import { Component, forwardRef, OnInit } from '@angular/core';
    import { ControlValueAccessor, FormControl, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms';
     
    @Component({
      selector: 'app-form-user',
      templateUrl: './form-user.component.html',
      styleUrls: ['./form-user.component.scss'],
      providers: [
        {
          provide: NG_VALUE_ACCESSOR,
          useExisting: forwardRef(() => FormUserComponent),
          multi: true
        }
      ]
    })
    export class FormUserComponent implements OnInit, ControlValueAccessor {
     
      formGroup = new FormGroup({
        name: new FormControl(),
        age: new FormControl()
      });
     
      onChange: (value: any) => void = () => { };
      onTouch: any = () => { }
     
      constructor() { }
     
      writeValue(obj: any): void {
        this.formGroup.setValue(obj);
      }
      registerOnChange(fn: any): void {
        this.formGroup.valueChanges.subscribe(fn);
      }
      registerOnTouched(fn: any): void {
        this.onTouch = fn;
      }
     
      ngOnInit(): void {
      }
     
    }

    Sur internet je trouve principalement des exemples de formarray qui n'héberge pas de sous composant, j'ai pas vu d'exemple similaire au mien ...

    Merci pour votre aide

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 707
    Par défaut
    t'as pas un stackblitz qu'on regarde ça ?

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    J'ai trouvé une solution il faut que je passe des formcontrol et non des formgroup dans mon formarray
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      form = new FormGroup({
        page: new FormControl("home"),
        users: new FormArray([new FormControl({ name: 'toto', age: 15 }),
        new FormControl({ name: 'jaja', age: 25 })])
      });

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 707
    Par défaut
    parfait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PatchValue avec FormArray
    Par eddyphan dans le forum Angular
    Réponses: 0
    Dernier message: 18/05/2020, 15h29
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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