Table des matières
Différence 2
Maison interface Web js tutoriel Enregistrement de problème de développement angulaire : le composant ne peut pas obtenir l'attribut d'entrée @Input

Enregistrement de problème de développement angulaire : le composant ne peut pas obtenir l'attribut d'entrée @Input

Dec 09, 2022 pm 08:17 PM
angular.js

Récemment, alors que j'implémentais une fonctionnalité au travail, j'ai rencontré un petit problème : AngulaireLe composant ne peut pas obtenir l'attribut d'entrée @Input Bien que je sois relativement familier avec ces problèmes, trouver le problème nécessite un processus, donc je le fais toujours. Résumez et notez ce problème.

Enregistrement de problème de développement angulaire : le composant ne peut pas obtenir l'attribut d'entrée @Input

【Recommandation de tutoriel connexe : "Tutoriel angulaire"】

Je dois définir un attribut d'entrée @Input sur un Component, d'accord, démarrez simplement le code, ce n'est pas difficile.

Le code original est comme ceci :

@Component({
	selector: 'my-menu',
	templateUrl: './main-menu.widget.html'
})
export class MyMenuWidget {
  data: any[];
  
  ...

    constructor(...) {
       this._changesSubscription = this._service.changes.pipe(
            map((data: any[]) => {
                    ...
                    return data;
            })
        ).subscribe((data: any[]) => {
            this.data = data;
        });
    }

  ...
}
Copier après la connexion

Ajoutez un attribut d'entrée :

@Component({
	selector: 'my-menu',
	templateUrl: './main-menu.widget.html'
})
export class MyMenuWidget {
  @Input() isMainMenu: boolean = false;

  data: any[];
  
  ...

    constructor(...) {
        this._changesSubscription = this._service.changes.pipe(
                map((data: any[]) => {
                        ...
                        return data;
                })
        ).subscribe((data: any[]) => {
            if (this.isMainMenu) {
               this.data = data.filter((d: any) => d.ID === 233);
            }
            else {
              this.data = data;
            }
        });
    }

  ...
}
Copier après la connexion

Utilisez-le :

<my-menu [isMainMenu]="mainMenu"></my-menu>
Copier après la connexion

Ensuite, j'ai découvert que l'attribut d'entrée isMainMenu dans MyMenuWidget ne peut toujours pas obtenir la valeur, où est l'orthographe ? Je l'ai vérifié et j'ai constaté qu'il n'y avait aucun problème, mais je n'ai tout simplement pas pu obtenir la valeur.

Regardez de plus près, ahhhh ? ? ? , l'abonnement à un Observable est en fait écrit dans le constructeur ! ! ! Bien qu'écrire de cette façon puisse fonctionner normalement dans certains scénarios et n'affecte pas la fonction du code, cette façon d'écrire est très irrégulière, provoquant des problèmes tout comme le code de l'exemple ci-dessus. Par conséquent, dans le processus de développement habituel, il n'est pas recommandé d'écrire ainsi. Alors, quelle est la bonne façon de l'écrire ?

Téléchargez le code.

@Component({
	selector: &#39;my-menu&#39;,
	templateUrl: &#39;./main-menu.widget.html&#39;
})
export class MyMenuWidget {
  @Input() isMainMenu: boolean = false;

  data: any[];
  
  ...
  
  constructor(...) {
     ...
  }
  
    ngOnInit() {
        this._changesSubscription = this._service.changes.pipe(
            map((data: any[]) => {
                ...
                return data;
            })
        ).subscribe((data: any[]) => {
            if (this.isMainMenu) {
                    this.data = data.filter((d: any) => d.ID === 233);
            }
            else {
                this.data = data;
            }
        });
    }

  ...
}
Copier après la connexion

Alors la question est : pourquoi le même code peut-il fonctionner normalement lorsqu'il est placé dans ngOnInit ? Certains diront qu'il faut simplement le mettre dans ngOnInit, mais pas dans le constructeur. Alors pourquoi pas, il faut le comprendre.

La question est : quelle est la différence entre le constructeur angulaire et la fonction ngOnInit ?

Différence 1

Différence de langue :

Examinons d'abord leurs différences du point de vue de la langue. ngOnInit n'est qu'une méthode sur la classe de composant. Sa structure n'est pas différente des autres méthodes de la classe, elle a juste un nom spécifique.

export class MyMenuWidget implements OnInit { 
   ngOnInit() {}
}
Copier après la connexion

C'est normal de l'implémenter ou non. Je peux toujours l'écrire comme ça, pas de problème du tout. Aucun balisage explicite n'est nécessaire pour implémenter cette interface.

export class MyMenuWidget {
   ngOnInit() {}
}
Copier après la connexion

Voici comment écrire ES6 Comment écrire le code ci-dessus dans ES5 ?

Le constructeur en est complètement différent. Il sera appelé lors de la création d'une instance de classe.

export class MyMenuWidget {
   constructor(){}
  
   ngOnInit() {}
}
Copier après la connexion

Différence 2

Différence dans le processus d'initialisation des composants :

Du point de vue de l'initialisation des composants, la différence entre les deux est toujours très grande. Le processus de démarrage d'Angular comporte deux étapes principales :
1. Construire l'arborescence des composants ; 2. Effectuer la détection des modifications ; Lorsque Angular construit l'arborescence des composants, il doit d'abord créer une instance de composant. créer une instance. C'est-à-dire appeler le constructeur de la classe de composant. Tous les hooks de cycle de vie, y compris ngOnInit, sont ensuite appelés dans le cadre de la phase de détection des changements.

Lorsque Angular démarre la détection des changements, l'arborescence des composants a été construite et les constructeurs de tous les composants de l'arborescence ont été appelés. De plus, le nœud de modèle de chaque composant est ajouté au DOM à ce stade. Ici, vous avez accès à toutes les données dont vous avez besoin pour initialiser le composant – fournisseur DI, DOM, etc. Le mécanisme de communication @Input est géré dans le cadre de la phase de détection des changements, donc @Input n'est pas disponible dans le constructeur.

export class MyMenuWidget {
   constructor(private _elementRef: ElementRef){
     ...
   }
  
   ngOnInit() {}
}
Copier après la connexion

Différence trois

Différences fonctionnelles :

Pour Angular

constructor

, il est principalement utilisé pour l'initialisation et l'injection de dépendances. L'approche habituelle consiste à mettre le moins de logique possible dans le constructeur. Parfois, même si vous mettez beaucoup de logique, cela n'affecte pas la fonctionnalité. Pour

ngOnInit

, Angular crée le DOM du composant, utilise le constructeur pour injecter toutes les dépendances nécessaires et appelle ngOnInit après avoir terminé l'initialisation. C'est un bon endroit pour exécuter la logique d'initialisation du composant. En termes simples

, le constructeur

constructeur lui-même n'a rien à voir avec Angular, ngOnInitces fonctions de hook sont définies dans Angular.

Résumé

Maintenant, il est clair pourquoi @Input ne peut pas obtenir la valeur dans le constructeur. À l'avenir, il sera clair quelle logique doit être placée dans le constructeur et laquelle doit être placée dans ngOnInit.

Pour plus de connaissances liées à la programmation, veuillez visiter :

Enseignement de la programmation

 ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Explication détaillée du gestionnaire d'état d'apprentissage angulaire NgRx Explication détaillée du gestionnaire d'état d'apprentissage angulaire NgRx May 25, 2022 am 11:01 AM

Cet article vous donnera une compréhension approfondie du gestionnaire d'état NgRx d'Angular et vous présentera comment utiliser NgRx. J'espère qu'il vous sera utile !

L'apprentissage angulaire parle de composants autonomes (Standalone Component) L'apprentissage angulaire parle de composants autonomes (Standalone Component) Dec 19, 2022 pm 07:24 PM

Cet article vous amènera à continuer à apprendre Angular et à comprendre brièvement le composant autonome (Standalone Component) dans Angular. J'espère qu'il vous sera utile !

Une brève analyse des composants indépendants dans Angular et voir comment les utiliser Une brève analyse des composants indépendants dans Angular et voir comment les utiliser Jun 23, 2022 pm 03:49 PM

Cet article vous présentera les composants indépendants dans Angular, comment créer un composant indépendant dans Angular et comment importer des modules existants dans le composant indépendant. J'espère qu'il vous sera utile !

Que dois-je faire si le projet est trop gros ? Comment diviser raisonnablement les projets Angular ? Que dois-je faire si le projet est trop gros ? Comment diviser raisonnablement les projets Angular ? Jul 26, 2022 pm 07:18 PM

Le projet Angular est trop volumineux, comment le diviser raisonnablement ? L'article suivant vous expliquera comment diviser raisonnablement les projets Angular. J'espère qu'il vous sera utile !

Parlons de la façon de personnaliser le format angulaire-datetime-picker Parlons de la façon de personnaliser le format angulaire-datetime-picker Sep 08, 2022 pm 08:29 PM

Comment personnaliser le format angulaire-datetime-picker ? L'article suivant explique comment personnaliser le format. J'espère qu'il sera utile à tout le monde !

Un guide étape par étape pour comprendre l'injection de dépendances dans Angular Un guide étape par étape pour comprendre l'injection de dépendances dans Angular Dec 02, 2022 pm 09:14 PM

Cet article vous guidera à travers l'injection de dépendances, présentera les problèmes que l'injection de dépendances résout et sa méthode d'écriture native, et parlera du framework d'injection de dépendances d'Angular. J'espère qu'il vous sera utile !

Sélecteurs :host, :host-context, ::ng-deep d'Angular Sélecteurs :host, :host-context, ::ng-deep d'Angular May 31, 2022 am 11:08 AM

Cet article vous donnera une compréhension approfondie de plusieurs sélecteurs spéciaux dans Angular : host, :host-context, ::ng-deep. J'espère qu'il vous sera utile !

Compréhension approfondie du décorateur @Component en angulaire Compréhension approfondie du décorateur @Component en angulaire May 27, 2022 pm 08:13 PM

Component est une sous-classe de Directive. C'est un décorateur utilisé pour marquer une classe comme composant angulaire. L'article suivant vous donnera une compréhension approfondie du décorateur @Component en angulaire. J'espère qu'il vous sera utile.

See all articles