Inhaltsverzeichnis
Unterschied 2
Heim Web-Frontend js-Tutorial Angular-Entwicklungsproblemdatensatz: Komponente kann das @Input-Eingabeattribut nicht abrufen

Angular-Entwicklungsproblemdatensatz: Komponente kann das @Input-Eingabeattribut nicht abrufen

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

Als ich kürzlich eine Funktion bei der Arbeit implementiert habe, bin ich auf ein kleines Problem gestoßen: AngularDie Komponente kann das @Input-Eingabeattribut nicht abrufen. Obwohl ich mit diesen Problemen relativ vertraut bin, ist ein Prozess erforderlich, um das Problem zu finden Fassen Sie dieses Problem zusammen und notieren Sie es.

Angular-Entwicklungsproblemdatensatz: Komponente kann das @Input-Eingabeattribut nicht abrufen

【Verwandte Tutorial-Empfehlung: „angular Tutorial“】

Ich muss ein Eingabeattribut @Input auf eine Component setzen, okay, starten Sie einfach den Code, es ist nicht schwierig.

Der ursprüngliche Code sieht so aus:

@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;
        });
    }

  ...
}
Nach dem Login kopieren

Fügen Sie ein Eingabeattribut hinzu:

@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;
            }
        });
    }

  ...
}
Nach dem Login kopieren

Verwenden Sie es:

<my-menu [isMainMenu]="mainMenu"></my-menu>
Nach dem Login kopieren

Dann habe ich festgestellt, dass das Eingabeattribut isMainMenu in MyMenuWidget den Wert immer nicht erhalten kann. Wo ist die Schreibweise? Haben Sie eine Frage? Ich habe es überprüft und festgestellt, dass es überhaupt kein Problem gab, aber ich konnte den Wert einfach nicht ermitteln.

Schau mal genauer hin, ahhhh? ? ? , das Abonnement eines Observable wird tatsächlich im Konstruktor geschrieben! ! ! Obwohl das Schreiben auf diese Weise in einigen Szenarien normal funktionieren kann und die Funktion des Codes nicht beeinträchtigt, ist diese Schreibweise sehr unregelmäßig und verursacht Probleme, genau wie der Code im obigen Beispiel. Daher wird es während der normalen Entwicklung nicht empfohlen, so zu schreiben. Wie schreibt man es also richtig?

Laden Sie den Code hoch.

@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;
            }
        });
    }

  ...
}
Nach dem Login kopieren

Dann stellt sich die Frage: Warum kann derselbe Code normal funktionieren, wenn er in ngOnInit platziert wird? Manche Leute werden sagen, dass wir es einfach in ngOnInit einfügen sollten, aber nicht im Konstruktor. Warum also nicht, muss noch geklärt werden.

Die Frage ist, was ist der Unterschied zwischen dem Angular-Konstruktor und der ngOnInit-Funktion?

Unterschied 1

Unterschied in der Sprache:

Betrachten wir zunächst ihre Unterschiede aus sprachlicher Sicht. ngOnInit ist nur eine Methode der Komponentenklasse. Ihre Struktur unterscheidet sich nicht von anderen Methoden der Klasse, sie hat lediglich einen bestimmten Namen.

export class MyMenuWidget implements OnInit { 
   ngOnInit() {}
}
Nach dem Login kopieren

Es ist in Ordnung, es umzusetzen oder nicht. Ich kann es immer noch so schreiben, überhaupt kein Problem. Zur Implementierung dieser Schnittstelle ist kein explizites Markup erforderlich.

export class MyMenuWidget {
   ngOnInit() {}
}
Nach dem Login kopieren

So schreibe ich ES6. Wie schreibe ich den obigen Code in ES5?

Der Konstruktor unterscheidet sich völlig davon. Er wird beim Erstellen einer Klasseninstanz aufgerufen.

export class MyMenuWidget {
   constructor(){}
  
   ngOnInit() {}
}
Nach dem Login kopieren

Unterschied 2

Unterschied im Komponenteninitialisierungsprozess:

Aus Sicht der Komponenteninitialisierung ist der Unterschied zwischen den beiden immer noch sehr groß. Der Startvorgang von Angular besteht aus zwei Hauptphasen:
1. Erstellen Sie den Komponentenbaum.

Wenn Angular den Komponentenbaum erstellt, muss der Konstruktor neu aufgerufen werden Erstellen Sie eine Instanz, indem Sie den Konstruktor der Komponentenklasse aufrufen. Alle Lebenszyklus-Hooks, einschließlich ngOnInit, werden dann im Rahmen der Änderungserkennungsphase aufgerufen.

Wenn Angular mit der Änderungserkennung beginnt, wurde der Komponentenbaum erstellt und die Konstruktoren aller Komponenten im Baum wurden aufgerufen. Darüber hinaus wird an dieser Stelle der Vorlagenknoten jeder Komponente zum DOM hinzugefügt. Hier haben Sie Zugriff auf alle Daten, die Sie zur Initialisierung der Komponente benötigen – DI-Provider, DOM usw. Der @Input-Kommunikationsmechanismus wird als Teil der Änderungserkennungsphase behandelt, daher ist @Input im Konstruktor nicht verfügbar.

export class MyMenuWidget {
   constructor(private _elementRef: ElementRef){
     ...
   }
  
   ngOnInit() {}
}
Nach dem Login kopieren

Unterschied drei

Funktionale Unterschiede:

Für Angular

Konstruktor wird es hauptsächlich zur Initialisierung und zum Einfügen von Abhängigkeiten verwendet. Der übliche Ansatz besteht darin, so wenig Logik wie möglich in den Konstruktor einzubauen. Manchmal hat dies keinen Einfluss auf die Funktionalität, auch wenn Sie viel Logik einbauen.

Für

ngOnInit erstellt Angular das DOM der Komponente, verwendet den Konstruktor, um alle erforderlichen Abhängigkeiten einzufügen, und ruft nach Abschluss der Initialisierung ngOnInit auf. Dies ist ein guter Ort, um die Komponenteninitialisierungslogik auszuführen.

Einfach ausgedrückt

, der Konstruktor der Konstruktor selbst hat nichts mit Angular zu tun, ngOnInitDiese Hook-Funktionen sind in Angular definiert.

Zusammenfassung

Jetzt ist klar, warum @Input den Wert im Konstruktor nicht erhalten kann. Zukünftig wird klar sein, welche Logik im Konstruktor und welche in ngOnInit platziert werden soll.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter:

Programmierlehre! !

Das obige ist der detaillierte Inhalt vonAngular-Entwicklungsproblemdatensatz: Komponente kann das @Input-Eingabeattribut nicht abrufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Angular Learning spricht über eigenständige Komponenten (Standalone Component) Angular Learning spricht über eigenständige Komponenten (Standalone Component) Dec 19, 2022 pm 07:24 PM

Dieser Artikel wird Sie dabei unterstützen, Angular weiter zu lernen und die eigenständige Komponente (Standalone Component) in Angular kurz zu verstehen. Ich hoffe, er wird Ihnen hilfreich sein!

Detaillierte Erläuterung des Angular Learning State Managers NgRx Detaillierte Erläuterung des Angular Learning State Managers NgRx May 25, 2022 am 11:01 AM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Angular-Statusmanagers NgRx und stellt Ihnen die Verwendung von NgRx vor. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Analyse unabhängiger Komponenten in Angular und deren Verwendung Eine kurze Analyse unabhängiger Komponenten in Angular und deren Verwendung Jun 23, 2022 pm 03:49 PM

Dieser Artikel führt Sie durch die unabhängigen Komponenten in Angular, wie Sie eine unabhängige Komponente in Angular erstellen und wie Sie vorhandene Module in die unabhängige Komponente importieren. Ich hoffe, er wird Ihnen hilfreich sein!

Was soll ich tun, wenn das Projekt zu groß ist? Wie teilt man Angular-Projekte sinnvoll auf? Was soll ich tun, wenn das Projekt zu groß ist? Wie teilt man Angular-Projekte sinnvoll auf? Jul 26, 2022 pm 07:18 PM

Das Angular-Projekt ist zu groß. Wie kann man es sinnvoll aufteilen? Der folgende Artikel zeigt Ihnen, wie Sie Angular-Projekte sinnvoll aufteilen. Ich hoffe, er ist hilfreich für Sie!

Lassen Sie uns darüber sprechen, wie Sie das Angular-DateTime-Picker-Format anpassen Lassen Sie uns darüber sprechen, wie Sie das Angular-DateTime-Picker-Format anpassen Sep 08, 2022 pm 08:29 PM

Wie kann ich das Angular-DateTime-Picker-Format anpassen? Im folgenden Artikel geht es um die Anpassung des Formats. Ich hoffe, er ist für alle hilfreich!

Eine Schritt-für-Schritt-Anleitung zum Verständnis der Abhängigkeitsinjektion in Angular Eine Schritt-für-Schritt-Anleitung zum Verständnis der Abhängigkeitsinjektion in Angular Dec 02, 2022 pm 09:14 PM

Dieser Artikel führt Sie durch die Abhängigkeitsinjektion, stellt die durch die Abhängigkeitsinjektion gelösten Probleme und ihre native Schreibmethode vor und spricht über das Abhängigkeitsinjektions-Framework von Angular. Ich hoffe, es wird Ihnen hilfreich sein!

Vertiefte Kenntnisse von NgModule (Modul) in Angular Vertiefte Kenntnisse von NgModule (Modul) in Angular Sep 05, 2022 pm 07:07 PM

Das NgModule-Modul ist ein wichtiger Punkt in Angular, da der Grundbaustein von Angular NgModule ist. Dieser Artikel führt Sie durch das NgModule-Modul in Angular. Ich hoffe, er wird Ihnen hilfreich sein!

Angulars :host-, :host-context- und ::ng-deep-Selektoren Angulars :host-, :host-context- und ::ng-deep-Selektoren May 31, 2022 am 11:08 AM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis mehrerer spezieller Selektoren in Angular: host, :host-context, ::ng-deep. Ich hoffe, er wird Ihnen hilfreich sein!

See all articles