検索
ホームページウェブフロントエンドjsチュートリアルAngular の HostBinding および HostListener デコレータの詳細

この記事では、Angular-HostBinding と HostListener の 2 つのデコレーターについて説明し、これら 2 つのデコレーターの使用シナリオを紹介します。

Angular の HostBinding および HostListener デコレータの詳細

私の疑問

Angular を独学で学習しているときに、この 2 つのデコレータに遭遇した人がいるかどうかはわかりません。 ——HostBinding および HostListener。公式サイトでこの 2 つのデコレーターの API の説明を読んだとき、単語はすべて理解できるのに、それらがつながっていると理解できなくなり、非常に戸惑いました。さらに、公式 Web サイトに示されている例も非常にわかりにくく、これら 2 つの API の使用シナリオがわかりにくくなっています。 [推奨関連チュートリアル: "angular チュートリアル"]

公式 Web サイトの説明

まず、これら 2 つの API の説明を見てみましょう。公式 Web サイト:

HostBinding(公式 Web サイトのリンク ):

は、DOM 属性をバインドされたプロパティとしてマークするために使用されます。ホストに接続し、構成メタデータを提供します。 Angular は、変更検出中にホスト プロパティのバインディングを自動的にチェックし、バインディングが変更された場合は、ディレクティブが配置されているホスト要素を更新します。

HostListener(公式 Web サイトのリンク ):

は、リッスンして提供する DOM イベントを宣言するために使用されます。イベント内の情報 これが発生したときに実行するハンドラー メソッド。

これを読んだ後、この 2 人の兄弟の使用シナリオがどのようなものであるかわかりませんか?私の意見では、これら 2 つのデコレータの機能は、複雑な DOM 操作を 1 つの命令に抽出してコードを合理化することを容易にする です。あまりナンセンスではありませんが、コードを読むだけで一目で理解できます。

コード例

現時点でビジネス シナリオがあるとします。入力ボックス

input があり、入力するたびに色が表示されます。文字数と枠線の色が変わるので「レインボー入力ボックス」と名付けました。

コンポーネントのカプセル化を使用しない場合は、関連する DOM 操作をコンポーネントに直接記述します。コードは次のとおりです:

@Component({
  selector: 'app-rainbow-input-demo',
  template: `
    <h3 id="这是一个彩虹输入框-每输入一次都会改变颜色">这是一个彩虹输入框,每输入一次都会改变颜色</h3>
    <input [class]="&#39;my-input&#39;"
           type="text"
           [style]="inputStyleObj"
           (keydown)="onKeyDown()"
    />
  `,
  styles:[
    `.my-input {
        border:none;
        outline: none;
        border: 2px solid #333333;
        border-radius: 5px;
      }`
  ]
})
export class RainbowInputDemoComponent {
  //默认的颜色样式
  public inputStyleObj = {
    color:null,
    borderColor:null,
  };
  //颜色库
  public possibleColors = [
    &#39;darksalmon&#39;, &#39;hotpink&#39;, &#39;lightskyblue&#39;,
    &#39;goldenrod&#39;, &#39;peachpuff&#39;, &#39;mediumspringgreen&#39;,
    &#39;cornflowerblue&#39;, &#39;blanchedalmond&#39;, &#39;lightslategrey&#39;
  ];
  //键盘落下事件
  onKeyDown(){
    const index = Math.floor(Math.random() * this.possibleColors.length);
    //如果我们直接使用this.inputStyleObj.color = this.possibleColors[index]的话,
    //this.inputStyleObj虽然内容变了,由于它是引用类型,其地址值没有变。所以不会触发视图的重新渲染
    //在angular中,和react似的,我们直接修改引用类型不会触发重新渲染,只能覆盖它或者合并它,使其地址值发生改变,才会触发重新渲染
    //如果觉得麻烦的话,完全可以在模板中使用[style.color]和[style.borderColor]
    this.inputStyleObj = {
      color:this.possibleColors[index],
      borderColor:this.possibleColors[index],
    }
  }
}

結果は次のとおりです:

Angular の HostBinding および HostListener デコレータの詳細

以上、この機能を実装しましたが、ここで問題が発生しました。この

rainbowInput を他のコンポーネントで使用する必要がある場合はどうすればよいでしょうか?使用するたびにこれらのコードをコピーして貼り付ける必要がありますか?これは明らかにコンポーネントのカプセル化の原則に準拠していません。本当にこれを行うと、技術マネージャーやプロジェクト マネージャーもびっくりするでしょう。

そこで、これをコンポーネントまたは命令にカプセル化する必要があります。この記事では、まずこれをコマンドにカプセル化します。その理由については後ほど説明します。コードは次のとおりです。

@Directive({
  selector: &#39;[appRainbow]&#39;
})
export class RainbowInputDirective {
  public possibleColors = [
    &#39;darksalmon&#39;, &#39;hotpink&#39;, &#39;lightskyblue&#39;,
    &#39;goldenrod&#39;, &#39;peachpuff&#39;, &#39;mediumspringgreen&#39;,
    &#39;cornflowerblue&#39;, &#39;blanchedalmond&#39;, &#39;lightslategrey&#39;
  ];
  //字体颜色
  @HostBinding(&#39;style.color&#39;) color: string;
  //边框颜色
  @HostBinding(&#39;style.borderColor&#39;) borderColor: string;
  //监听键盘落下的事件
  @HostListener(&#39;keydown&#39;) onKeyDown() {
    //获取一个随机的颜色
    const index = Math.floor(Math.random() * this.possibleColors.length);
    this.color = this.borderColor = this.possibleColors[index];
  }
}

@Component({
  selector: &#39;app-rainbow-input-demo&#39;,
  template: `
    <h3 id="这是一个彩虹输入框-每输入一次都会改变颜色">这是一个彩虹输入框,每输入一次都会改变颜色</h3>
    <input [class]="&#39;my-input&#39;" type="text" appRainbow />
  `,
  styles:[
   	//省略,和上面相同
  ]
})
export class RainbowInputDemoComponent {}

上記のコードと同様に、繰り返されるロジックを抽出することで、コードの保守性と美しさが大幅に向上しました。

結論

コードでは、@HostBinding の機能が実際には特定の属性をホスト要素にバインドすることであることがわかりますが、この

attribute単なる 属性 ではありません。この属性は、Angular テンプレートでサポートされている属性を指します。実際、@HostBinding は、テンプレートの [] または bind- と同等です。同様に、@HostListener は、テンプレート内の () または on- と同等です。これにより、命令内のホスト要素に属性とメソッドをバインドできるようになります。達成される効果は、(keydow)[style] を最初に直接記述した場合と同じです。テンプレート上で。したがって、これら 2 つのデコレータの文字列を無造作に記述することはできません。

命令とコンポーネントについて

ただし、実際には、Angular ではコンポーネントと命令の違いはそれほど大きくありません。これは、Angular のコンポーネント デコレータ @Component が次のとおりであるためです。 @ディレクティブから継承されます。

実際、この DOM 操作をコンポーネントにカプセル化することは不可能ではありません。コードは次のとおりです

@Component({
  selector:&#39;input[appRainbow]&#39;
})

ですが、実際には命令の記述方法とあまり変わりません。

ええー

概要

@HostBinding は、テンプレート @HostListener は、テンプレートの

() または on- と同等です。

は、Angular によって提供される命令内のデータとメソッド バインディングです。私たちは DOM を直接操作します。

プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !

以上がAngular の HostBinding および HostListener デコレータの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は掘金社区で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 Mac版

SublimeText3 Mac版

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

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール