目次
違い 2
ホームページ ウェブフロントエンド jsチュートリアル Angular 開発の問題レコード: コンポーネントは @Input 入力属性を取得できません

Angular 開発の問題レコード: コンポーネントは @Input 入力属性を取得できません

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

最近仕事で機能を実装していたときに、小さな問題が発生しました: Angularコンポーネントは @Input 入力属性を取得できません。これらの問題については比較的よく知っていますが、次のことを見つける必要があります。これはプロセスなので、この問題を要約して記録します。

Angular 開発の問題レコード: コンポーネントは @Input 入力属性を取得できません

[関連チュートリアルの推奨事項: "angular チュートリアル"]

コンポーネント#を指定する必要があります# #入力属性を設定します@Input、コーディングするだけです。難しいことではありません。

元のコードは次のとおりです:

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

  ...
}
ログイン後にコピー

入力属性を追加します:

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

  ...
}
ログイン後にコピー

使用してください:

<my-menu [isMainMenu]="mainMenu"></my-menu>
ログイン後にコピー

その後、

MyMenuWidget の入力属性 isMainMenu が値を取得できないことがわかりました。スペルに何か問題がありますか?調べてみると特に問題はなかったのですが、値が取得できませんでした。

よく見てください、ああああ? ? ?

Observable へのサブスクリプションは、実際にはコンストラクターに書き込まれます。 ! !この方法で記述すると、一部のシナリオでは正常に動作し、コードの機能には影響しませんが、この書き方は非常に不規則であり、上記の例のコードと同様の問題が発生します。したがって、通常の開発ではこのように書くことはお勧めできません。

コードをアップロードします。

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

  ...
}
ログイン後にコピー

そこで問題は、なぜ同じコードを

ngOnInit に配置しても正常に動作するのかということです。コンストラクターではなく、ngOnInit に入れるべきだと言う人もいるでしょう。では、なぜそうではないのかを解明する必要があります。

問題は、Angular コンストラクターと ngOnInit 関数の違いは何でしょうか?

違い 1

言語の違い:

まず、言語の観点から両者の違いを見てみましょう。

ngOnInit はコンポーネント クラスのメソッドにすぎません。特定の名前が付いていることを除けば、その構造はクラスの他のメソッドと変わりません。

export class MyMenuWidget implements OnInit { 
   ngOnInit() {}
}
ログイン後にコピー

実装してもしなくても、このままでも全然問題なく書けます。このインターフェイスを実装するために明示的なマークアップは必要ありません。

export class MyMenuWidget {
   ngOnInit() {}
}
ログイン後にコピー

これは ES6 の書き方です。ES5 で上記のコードを書くにはどうすればよいですか?

コンストラクタはそれとは全く異なり、クラスのインスタンス作成時に呼び出されます。

export class MyMenuWidget {
   constructor(){}
  
   ngOnInit() {}
}
ログイン後にコピー

違い 2

コンポーネント初期化プロセスの違い:

コンポーネントの初期化の観点から見ると、この 2 つの違いは依然として非常に大きいです。 Angular の起動プロセスには 2 つの主な段階があります:


1. コンポーネント ツリーの構築; 2. 変更検出の実行;

Angular がコンポーネント ツリーを構築するときは、コンポーネント インスタンスを作成する必要があります。まず、コンストラクター new が呼び出されてインスタンスが作成され、これによりコンポーネント クラスのコンストラクターが呼び出されます。 ngOnInit を含むすべてのライフサイクル フックは、変更検出フェーズの一部として呼び出されます。

Angular が変更検出を開始すると、コンポーネント ツリーが構築され、ツリー内のすべてのコンポーネントのコンストラクターが呼び出されます。さらに、各コンポーネントのテンプレート ノードがこの時点で DOM に追加されます。ここでは、コンポーネントの初期化に必要なすべてのデータ (DI プロバイダー、DOM など) にアクセスできます。 @Input 通信メカニズムは変更検出フェーズの一部として処理されるため、コンストラクターでは @Input を使用できません。

export class MyMenuWidget {
   constructor(private _elementRef: ElementRef){
     ...
   }
  
   ngOnInit() {}
}
ログイン後にコピー

違い 3

機能上の違い:

Angular

コンストラクター の場合、主に初期化と依存関係の注入に使用されます。通常のアプローチは、コンストラクターにできるだけ少ないロジックを入れることですが、場合によっては、多くのロジックを入れても、機能に影響を与えないことがあります。

ngOnInit の場合、Angular はコンポーネントの DOM を作成し、コンストラクターを使用して必要な依存関係をすべて注入し、初期化の完了後に ngOnInit を呼び出します。これは、コンポーネントの初期化ロジックを実行するのに適した場所です。 。

簡単に言えば、

、constructorコンストラクター自体は Angular とは何の関係もありません。ngOnInitこれらのフック関数は Angular で定義されています。

概要

@Input がコンストラクターで値を取得できない理由は明らかでしょうか。将来的には、どのロジックをコンストラクターに配置する必要があり、どのロジックを ngOnInit に配置する必要があるかが明確になるでしょう。

プログラミング関連の知識について詳しくは、

プログラミング教育をご覧ください。 !

以上がAngular 開発の問題レコード: コンポーネントは @Input 入力属性を取得できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Angular Learning State Manager NgRx の詳細な説明 Angular Learning State Manager NgRx の詳細な説明 May 25, 2022 am 11:01 AM

この記事では、Angular のステートマネージャー NgRx について深く理解し、NgRx の使用方法を紹介します。

Angular の学習ではスタンドアロン コンポーネントについて説明します (Standalone Component) Angular の学習ではスタンドアロン コンポーネントについて説明します (Standalone Component) Dec 19, 2022 pm 07:24 PM

この記事では、Angular の学習を継続し、Angular のスタンドアロン コンポーネント (Standalone Component) について簡単に理解できるようにします。

Angular の独立したコンポーネントの簡単な分析とその使用方法を説明します。 Angular の独立したコンポーネントの簡単な分析とその使用方法を説明します。 Jun 23, 2022 pm 03:49 PM

この記事では、Angular の独立コンポーネント、Angular で独立コンポーネントを作成する方法、および既存のモジュールを独立コンポーネントにインポートする方法について説明します。

プロジェクトが大きすぎる場合はどうすればよいですか? Angular プロジェクトを合理的に分割するにはどうすればよいでしょうか? プロジェクトが大きすぎる場合はどうすればよいですか? Angular プロジェクトを合理的に分割するにはどうすればよいでしょうか? Jul 26, 2022 pm 07:18 PM

Angular プロジェクトが大きすぎます。適切に分割するにはどうすればよいですか?次の記事では、Angular プロジェクトを合理的に分割する方法を紹介します。

angular-datetime-picker 形式をカスタマイズする方法について話しましょう angular-datetime-picker 形式をカスタマイズする方法について話しましょう Sep 08, 2022 pm 08:29 PM

angular-datetime-picker 形式をカスタマイズするにはどうすればよいですか?次の記事ではフォーマットのカスタマイズ方法について説明していますので、皆様のお役に立てれば幸いです。

Angular での依存関係の挿入を理解するためのステップバイステップ ガイド Angular での依存関係の挿入を理解するためのステップバイステップ ガイド Dec 02, 2022 pm 09:14 PM

この記事では、依存性注入について説明し、依存性注入によって解決される問題とそのネイティブの記述方法を紹介し、Angular の依存性注入フレームワークについて説明します。

Angular の :host、:host-context、::ng-deep セレクター Angular の :host、:host-context、::ng-deep セレクター May 31, 2022 am 11:08 AM

この記事では、Angular のいくつかの特別なセレクター (host、:host-context、::ng-deep) について詳しく説明します。お役に立てば幸いです。

Angular の @Component デコレータについての深い理解 Angular の @Component デコレータについての深い理解 May 27, 2022 pm 08:13 PM

コンポーネントはディレクティブのサブクラスであり、クラスを Angular コンポーネントとしてマークするために使用されるデコレーターです。次の記事では、Angular の @Component デコレータについて詳しく説明します。

See all articles