この記事では、Angular での入出力の概要 (コード付き) を紹介します。これには一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。
Input はプロパティ デコレータであり、コンポーネント内で入力プロパティを定義するために使用されます。実際のアプリケーションでは、主に親コンポーネントから子コンポーネントにデータを転送するために使用します。 Angular アプリケーションはさまざまなコンポーネントで構成されており、アプリケーションが開始されると、Angular はルート コンポーネントから開始してコンポーネント ツリー全体を解析し、データは上から下に次のレベルのサブコンポーネントに流れます。
@Input()
counter.component.ts import { Component, Input } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input() count: number = 0; increment() { this.count++; } decrement() { this.count--; } }
app.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <exe-counter [count]="initialCount"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; }
@Input('bindingPropertyName')
入力デコレータは、使用されるオプションのパラメータをサポートします。コンポーネント バインディング プロパティの名前を指定します。指定しない場合、デフォルトで @Input デコレーターが使用され、装飾されたプロパティ名が使用されます。具体的な例は次のとおりです。
counter.component.ts
import { Component, Input } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input('value') count: number = 0; ... // 其余代码未改变 }
app.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <exe-counter [value]="initialCount"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; }
setter & getter
setter と getter を使用します。属性の設定と取得により、属性の読み取りと書き込みがカプセル化され、コードがより便利でスケーラブルになります。セッターとゲッターを通じて、クラス内のプライベート プロパティをカプセル化し、外部操作がプライベート プロパティに影響を与えるのを防ぎます。さらに、セッターを通じていくつかのビジネス ロジックをカプセル化することもできます。具体的な例は次のとおりです:
counter.component.ts
import { Component, Input } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }} </p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { _count: number = 0; // 默认私有属性以下划线开头,不是必须也可以使用$count biggerThanTen: boolean = false; @Input() set count (num: number) { this.biggerThanTen = num > 10; this._count = num; } get count(): number { return this._count; } increment() { this.count++; } decrement() { this.count--; } }
ngOnChanges
When the value of theデータ バインディングの入力属性が変更されると、Angular はアクティブに ngOnChanges メソッドを呼び出します。バインドされたプロパティの新しい値と古い値を含む SimpleChanges オブジェクトを取得します。主にコンポーネントの入力プロパティの変更を監視するために使用されます。具体的な例は次のとおりです。
import { Component, Input, SimpleChanges, OnChanges } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent implements OnChanges{ @Input() count: number = 0; ngOnChanges(changes: SimpleChanges) { console.dir(changes['count']); } increment() { this.count++; } decrement() { this.count--; } }
上記の例では、入力属性の値が手動で変更された場合、ngOnChanges フックがトリガーされないことに注意してください。
Output は、コンポーネント内の出力プロパティを定義するために使用されるプロパティ デコレータです。前に入力デコレータの役割を紹介しました。また、アプリケーションが起動すると、Angular がルート コンポーネントから開始してコンポーネント ツリー全体を解析し、データが上から下に次のレベルのサブコンポーネントに流れることも学びました。今回紹介した出力デコレーターは、子コンポーネントを実装し、イベント形式で親コンポーネントに情報を通知するために使用されます。
Output プロパティ デコレーターを紹介する前に、まず EventEmitter の背後にあるヒーローを紹介しましょう。カスタム イベントをトリガーするために使用されます。具体的な使用例は次のとおりです:
let numberEmitter: EventEmitter<number> = new EventEmitter<number>(); numberEmitter.subscribe((value: number) => console.log(value)); numberEmitter.emit(10);
Angular での EventEmitter のアプリケーション シナリオは次のとおりです:
サブコマンドは EventEmitter インスタンスを作成し、それを次のようにエクスポートします出力属性。子命令は、作成された EventEmitter インスタンスの Emit(payload) メソッドを呼び出してイベントをトリガーします。親命令は、イベント バインディング (eventName) を通じてイベントをリッスンし、$event オブジェクトを通じてペイロード オブジェクトを取得します。少し抽象的だと感じたら、すぐに実践してみましょう。
@Output()
counter.component.ts import { Component, Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input() count: number = 0; @Output() change: EventEmitter<number> = new EventEmitter<number>(); increment() { this.count++; this.change.emit(this.count); } decrement() { this.count--; this.change.emit(this.count); } }
app.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <p>{{changeMsg}}</p> <exe-counter [count]="initialCount" (change)="countChange($event)"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; changeMsg: string; countChange(event: number) { this.changeMsg = `子组件change事件已触发,当前值是: ${event}`; } }
@Output('bindingPropertyName')
出力デコレータは、使用されるオプションのパラメータをサポートします。コンポーネント バインディング プロパティの名前を指定します。指定しない場合、デフォルトで @Output デコレーターが使用され、装飾されたプロパティ名が使用されます。具体的な例は次のとおりです。
counter.component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input() count: number = 0; @Output('countChange') change: EventEmitter<number> = new EventEmitter<number>(); ... // 其余代码未改变 }
app.component.ts
##
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <p>{{changeMsg}}</p> <exe-counter [count]="initialCount" (countChange)="countChange($event)"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; changeMsg: string; countChange(event: number) { this.changeMsg = `子组件change事件已触发,当前值是: ${event}`; } }双方向バインディング双方向バインディングを導入する前に、まず要件について話しましょう。CounterComponent サブコンポーネントのカウント値が変更されると、AppComponent 親コンポーネントのinitialCount の値が同期的に更新される必要があります。上記の例を通じて、AppComponent 親コンポーネント内の CounterComponent サブコンポーネントの変更イベントをリッスンし、変更イベント内のInitialCount の値を更新できることがわかります。具体的な例は次のとおりです。 counter.component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>子组件当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input() count: number = 0; @Output() change: EventEmitter<number> = new EventEmitter<number>(); increment() { this.count++; this.change.emit(this.count); } decrement() { this.count--; this.change.emit(this.count); } }app.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <p>父组件当前值:{{ initialCount }}</p> <exe-counter [count]="initialCount" (change)="initialCount = $event"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; }実際には、双方向バインディングは 2 つの一方向バインディングで構成されます。バインディング: Model-> View データ バインディングView-> モデル イベント バインディングAngular [] はモデルからビューへのデータ バインディングを実装し、() は View を実装しますイベントバインディングをモデル化します。それら 2 つを組み合わせると [()] 双方向バインディングが実現します。ボックス構文のバナナとも呼ばれます。 [()] 構文例counter.component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'exe-counter', template: ` <p>子组件当前值: {{ count }}</p> <button (click)="increment()"> + </button> <button (click)="decrement()"> - </button> ` }) export class CounterComponent { @Input() count: number = 0; // 输出属性名称变更: change -> countChange @Output() countChange: EventEmitter<number> = new EventEmitter<number>(); ... // 其余代码未改变 }app.component.ts
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <p>父组件当前值:{{ initialCount }}</p> <exe-counter [(count)]="initialCount"></exe-counter> ` }) export class AppComponent { initialCount: number = 5; }上記からわかるように、 [(modelName)] は、modelName と modelNameChange の 2 つの部分に分割できます。[modelName] は入力プロパティのバインドに使用され、(modelNameChange) は出力プロパティのバインドに使用されます。 Angular は、テンプレートの解析時に [(modelName)] 形式のバインディング構文を検出すると、modelName という名前の入力プロパティと、modelNameChange という名前の出力プロパティがこのディレクティブに存在することを期待します。 ngModel Angular 1.x を使用したことのある読者は、データの双方向バインディングを実現するために使用する ng-model ディレクティブに精通しているはずです。では、Angular には対応する命令はあるのでしょうか?答えは「はい」です、それは ngModel ディレクティブです。 ngModel 双方向バインディングの例
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', template: ` <p>你输入的用户名是:{{ username }}</p> <input type="text" [(ngModel)]="username" /> ` }) export class AppComponent { username: string = ''; }ngModel フォーム検証の例
import { Component } from '@angular/core'; @Component({ selector: 'exe-app', styles:[ `.error { border: 1px solid red;}` ], template: ` <p>你输入的用户名是:{{ username }}</p> <input type="text" [(ngModel)]="username" #nameModel="ngModel" [ngClass]="{error: nameModel.invalid}" required/> {{nameModel.errors | json}} ` }) export class AppComponent { username: string = ''; }上記の例では、 @Directive ディレクティブのメタデータ情報の exportAs 属性を使用して ngModel を取得しますインスタンスを作成してコントロールのステータスを取得すると、コントロールのステータスは次のように分類されます。 valid - フォーム値は有効です pristine - フォーム値は変更されていません dirty -フォームの値が変更されました touched - フォームがアクセスされました
untouched - フォームはアクセスされていません
以上がAngular での入出力の概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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