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 :

Générer le contenu d'un selecteur autocomplete en fonction d'un autre


Sujet :

Angular

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut Générer le contenu d'un selecteur autocomplete en fonction d'un autre
    Salut !

    La théorie :
    Je suis en train de créer deux sélecteur de type "autocomplete" -> (démo, ce n'est pas la mienne): https://stackblitz.com/angular/ndkxa...ter-example.ts
    J'ai besoin que lorsque j'arrive sur la page, le premier sélecteur soit remplit de contenu, "une liste de nom doit être dedans".
    Une fois le nom sélectionné, alors une requête HTTP doit être lancé avec le nom sélectionné getTagsOfImage(nomImage) pour récupérer des "tags" et remplir mon deuxième sélecteur.
    Si je supprime le contenu du premier sélecteur :
    - Le premier selecteur doit revenir à l'état initial.
    - Le deuxième sélecteur ne doit contenir aucun valeur ( vu qu'aucune image n'a été selectionnée).


    Le problème :
    -Lors du chargement de la page, une requête part pour chercher des tags alors que l'image n'a pas été selectionnée..
    - Lors de la suppression de l'image dans le selecteur, idem, les tags sont recherchés..

    TS :
    Code javascript : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    export class ... {
      ...
     
      filteredOptions: Observable<any[]>;
      filteredOptions2: Observable<any[]>;
     
     
     
      constructor(..){
      }
     
      ngOnInit() {
        this.containerForm = this.formBuilder.group({
          ...
          image: new FormControl(' ', Validators.required),
          imageTag: new FormControl('', Validators.compose([Validators.required, Validators.minLength(1)])),
          ...
        });  
     
     
        this.filteredOptions = this.containerForm.controls.image.valueChanges.pipe(
          startWith(''),
          debounceTime(400),
          distinctUntilChanged(),
          switchMap(val => {
                return this.filter(val || '')
           }) 
        )     
      }
     
      searchTagOfImage(): void{ 
     
          this.filteredOptions2 = this.containerForm.controls.imageTag.valueChanges.pipe(
            startWith(''),
            debounceTime(400),
            distinctUntilChanged(),
            switchMap(val => {
     
             //////////////////////// console.log("fired here, should not be !");/////////////
     
                  return this.filter2(val || '')
            }) 
          )  
     
      }
     
      filter(val: string): Observable<any[]> {
        console.log("toutes les images");
        // call the service which makes the http-request
        return this.dataService.getImagesAvailable()
         .pipe(
           map(response => response.filter(option => { 
             return option.name.toLowerCase().indexOf(val.toLowerCase()) === 0
           }))
         )
      } 
     
     
      filter2(val: string): Observable<any[]> {
        // call the service which makes the http-request
       /////////console.log("IT GOES HERE, BUT SHOULD NOT ! Because this.image.value is empty..");///////////
        return this.dataService.getTagsOfImage(this.image.value)
         .pipe(
           map(response => response.filter(option => { 
             return option.tag.toLowerCase().indexOf(val.toLowerCase()) === 0
           }))
         )      
      }  
     
      displayFn(user: any): string {
        return user && user.name ? user.name : '';
      }
     
      displayFn2(user: any): string {
        return user && user.tag ? user.tag : '';
      }
     
      deleteVariable(variable: string, e?, i?): void {
     
        switch (variable) {
          ...
          case 'image':
            this.containerForm.controls.imageTag.patchValue('', { emitEvent: false });
            this.containerForm.controls.image.patchValue('', { emitEvent: false });
            break;
          case 'imageTag':
            this.containerForm.controls.imageTag.patchValue('', { emitEvent: false });
            break;
          default:
            break;
        }
      } 
     }
    }


    Code html : 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
     
    <div class="col-md-3">
                    <div class="form-group">
                      <label for="inputImageName" class="label">Image du conteneur</label>
                      <nb-form-field>
                        <input [formControl]="image" nbInput fullWidth type="text" placeholder="Image du conteneur" [nbAutocomplete]="auto" />
                        <button nbSuffix nbButton ghost type="button" (click)="deleteVariable('image')">
                          <i class="fas fa-times"></i>
                        </button>
                      </nb-form-field>
                      <nb-autocomplete #auto [displayWith]="displayFn" (selectedChange)="searchTagOfImage()">
                        <nb-option *ngFor="let option of filteredOptions | async" [value]="option.name">
                          {{ option.name }}
                        </nb-option>
                      </nb-autocomplete>
                    </div>
                  </div>


    Ce bug cause aussi qu'au lancement de la page, l'input sélectionné par défaut est le sélecteur de tag..

    Merci pour l'aide
    Nom : bugselecteur.gif
Affichages : 382
Taille : 687,8 Ko

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut
    Je n'ai toujours pas réussit a corriger le problème.
    Lors je supprime manuellement le champs image avec la touche supprimer, le problème ne se produit pas, alors qu'en cliquant sur le bouton supprimer c'est comme si un "event" de sélection de contenu était lancé par le patchValue alors que je lui demande de ne pas lancer d'évent.

  3. #3
    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
    si tu peux mettre ça sur stackblitz parceque comment veux tu debugguer comme ça à l'aveuglette

    pour les accès api

    tu fais un console.log( (des données)
    copie colle la sortie
    JSON.stringify(des données)

    tu renvoi JSON.parse(xdes données stringifier)
    pour simuler l'envois

    tu commente bien sur ta requete // http.get( ....

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut
    J'essaie au maximum de mettre des stackblitz, mais parfois tendu de reproduire le cas..
    Je n'ai pas réussi à faire fonctionner le stack sur ce theme : https://stackblitz.com/edit/angular-...p.component.ts

  5. #5
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    tu pouvais juste laisser les 2 selects avec l'autocomplete

    c'est option et option2 ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut
    Je viens de supprimer l'inutile : https://stackblitz.com/edit/angular-...p.component.ts
    option et option2 ont étés renommés

    Le stackblitz est ce que j'ai de mon coté actuellement

    Je suis sur que le problème vient de là : <nb-autocomplete #auto (selectedChange)="searchTagOfImage()">
    et la fonction searchTagOfImage()

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

Discussions similaires

  1. JSF pour générer le contenu d'un courriel
    Par Khaled.Noordin dans le forum JSF
    Réponses: 3
    Dernier message: 29/02/2012, 22h28
  2. Réponses: 11
    Dernier message: 23/04/2009, 16h18
  3. [OpenOffice][Tableur] Comment générer le contenu de cellules
    Par Walterbelo dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 16/03/2009, 04h24
  4. Générer du contenu statique à partir d'une jsp
    Par xtope dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 25/02/2009, 18h14
  5. Contenu d'une liste deroulante en fonction d'une autre
    Par kevain_09 dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/06/2007, 12h42

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