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 :

Créer dynamiquement un élément


Sujet :

Angular

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut Créer dynamiquement un élément
    Bon allez, j'en profite tant que tu es par là...Une question à mi chemin entre js et angular...

    Je voudrais afficher un élément dynamiquement et j'ai essayé d'utiliser l'exemple de MDN ici :

    https://developer.mozilla.org/fr/doc.../createElement
    Mais impossible de le faire tourner ds un projet angular (sur codepen ça marche) j'ai l'erreur suivante ds mon code :

    Type 'void' is not assignable to type '(this: GlobalEventHandlers, ev: Event) => any'.ts(2322)
    le .ts : quasi un copié collé de mdn

    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
     
      ngOnInit(): void {
        document.body.onload = this.addElement();
      }
     
      addElement(): void {
        // crée un nouvel élément div
        var newDiv = document.createElement("div");
        // et lui donne un peu de contenu
        var newContent = document.createTextNode('Hi there and greetings!');
        // ajoute le nœud texte au nouveau div créé
        newDiv.appendChild(newContent);
     
        // ajoute le nouvel élément créé et son contenu dans le DOM
        var currentDiv = document.getElementById('div1');
        document.body.insertBefore(newDiv, currentDiv);
      }
     
    }
    le html est un pur copié collé.
    Faut faire un ngAfterViewInit ?
    merci de ton 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
    et bien en fait tu peux faire ça en angular.
    sache que toute la puissance d'Angular justement est sur ce point là : la modification du DOM
    il ne faut pas utiliser du simple JS dans de l'angular, sacrilège !

    et en effet, dans : ngAfterViewInit
    parcequ'on travaille sur la vue une fois que celle ci est initialisé.
    contrairement à ngOnInit on s'en fou de la vue, on recupere des trucs dans l'api etc....

    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
     
     
    <ng-container #child1></ng-container>
    ...
    ...
    @ViewChild('child1', { read: ElementRef, static: false }) childElementRef: ElementRef; 
    ...
      constructor (private renderer: Renderer2){
      }
    ...
    ...
    ngAfterViewInit(): void {    
        const p: HTMLParagraphElement = this.renderer.createElement('p');
        p.innerHTML = "add new"
        this.renderer.appendChild(this.childElementRef.nativeElement, p)
    }
    ...

    dans cette exemple on fait le job dans un composant
    mais il est de bonne pratique de faire ça dans une directive

    une directive = un composant sans la vue (car on travaille la vue directement dans le code, on ajoute ou retire des éléments html, on ajoute, retire des classes, des styles en fonctions de différentes données que l'on récupère via les services)


    pourquoi faire de la vue en code et pas dans la vue (le HTML) directement ?
    parceque parfois il y a de nombreuses conditions, de données diverses et faire ça dans la vue deviendrait une usine à gaz
    donc, faire ça en code
    if (bidule == 4) alors j'ajoute un element HTML
    sinon je le modifie
    etc....

    c'est plus simple et plus performant que de mettre des *ngIf, *ngFor partout dans la vue.



    mais bien sur, tout cela demande d'abord de se former quelques heures !

    pour comprendre le pourquoi ? je te conseil de bien suivre ce tuto :



    il montre la version JS et la même chose en Angular !


    et ensuite, de voir d'autres tutos pour approfondir le sujet !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    T'es top, c'est vrai que les lifecycle hook je suis pas à l'aise...Mais avec une réponse comme ça je devrai y arriver ! Merciiiiiiiiiiiiiiiii !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2010, 13h35
  2. Créer dynamiquement un fichier XML
    Par sigap dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 26/07/2005, 12h53
  3. est il possible de créer dynamiquement une class ???
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 12/07/2005, 16h22
  4. [MFC] Créer dynamiquement une classe
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/2004, 13h23
  5. Réponses: 4
    Dernier message: 13/05/2004, 13h15

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