テンプレートのAngular 2ハッシュタグはどういう意味ですか?


135

私はangular 2で作業していますが、次のようなものが見つかりました

<input #searchBox (keyup)="search(searchBox.value)"

そしてそれは動作します。

しかし、#searchBoxの意味がわかりません。どちらのドキュメントにも明確な情報は見つかりませんでした。

誰か私にそれがどのように機能するか説明できますか?


2
Angular2の括弧、括弧、アスタリスクの違い何ですか?-" DOM要素<div #mydiv>での要素への参照 "。つまり、キーアップハンドラーで#searchBox使用できるのは、要素を持つことですsearchBox.value
Joe Clay

その変数。
ハリー

回答:


177

これは、DOM要素を変数として宣言するAngular 2テンプレートシステムで使用される構文です。

ここで、コンポーネントにテンプレートURLを指定します。

import {Component} from 'angular2/core';

@Component({
   selector: 'harrys-app',
   templateUrl: 'components/harry/helloworld.component.html'
})

export class HarrysApp {}

テンプレートはHTMLをレンダリングします。テンプレートでは、データ、プロパティバインディング、イベントバインディングを使用できます。これは、次の構文で実行されます。

# -変数宣言

() -イベントバインディング

[] -プロパティバインディング

[()] -双方向のプロパティバインディング

{{ }} -補間

* -構造ディレクティブ

#構文は、DOMは、テンプレート内のオブジェクトを参照するローカル変数名を宣言することができます。例えば

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}

6
作業例:<input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>。Fooはdivに表示されます。
ブロードバンド

3
そして、その変数宣言自体を変数にする方法はありませんか?メニューのネストされた複雑なオブジェクトからマテリアルメニュー項目を作成しようとしていますが、これは私を困惑させました。DOM変数を動的に作成することはできません。彼らは本当にdomにハードコーディングする必要があるのでしょうか?
crowmagnumb

2
公式ドキュメントの参照:angular.io/guide/...
千木郷


31

angulartraining.comから:

テンプレート参照変数は、Angularで多くの素晴らしいことを行えるようにする小さな宝石です。テンプレートの要素への参照を作成するために単純なハッシュタグに依存しているため、私は通常、その機能を「ハッシュタグ構文」と呼びます。

<input #phone placeholder="phone number">

上記の構文は非常に単純です。後でテンプレートで使用できるinput要素への参照を作成します  。この変数のスコープは、参照が定義されているHTMLテンプレート全体であることに注意してください。

たとえば、その参照を使用して入力の値を取得する方法を次に示します。

<!-- phone refers to the input element --> 
<button (click)="callPhone(phone.value)">Call</button>

電話  は入力のHTMLElementオブジェクトインスタンスを  参照する  ことに注意してください  。その結果、  電話  は、任意のHTMLElementのすべてのプロパティとメソッド(ID、名前、innerHTML、値など)が含まれます。

上記は、検証に関してそれほど必要としない単純な形式でngModelまたは他の種類のデータバインディングを使用しないようにするための良い方法です。


これはコンポーネントでも機能しますか?

答えはイエスです!

...その最も良い部分は、実際のコンポーネントインスタンスHelloWorldComponentへの参照を取得しているため、そのコンポーネントのメソッドまたはプロパティにアクセスできることです(それらがprivateまたはprotectedとして宣言されていても、これは驚くべきことです) :

@Component({
  selector: 'app-hello',
  // ...

export class HelloComponent {
   name = 'Angular';
}

[...]

<app-hello #helloComp></app-hello>

<!-- The following expression displays "Angular" -->
{{helloComp.name}}

2
「それらがプライベートまたは保護されていると宣言されていても、これは驚くべきことです」-アクセス指定子はコンパイル時のガードであり、通常、コードがコンパイルおよび実行された後は何もしないことに注意してください。
Tongfa

21

参照するテンプレート変数を作成します

  • input要素は、プレーンなDOM要素である場合、要素
  • コンポーネントまたはディレクティブのインスタンスである場合は、コンポーネントまたはディレクティブのインスタンス
  • それはのように使われている場合は、いくつかの特定のコンポーネントまたはディレクティブの#foo="bar"ときbarであります
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

このようなテンプレート変数は、テンプレートバインディングまたは次のような要素クエリで参照できます。

@ViewChild('searchBox') searchBox:HTMLInputElement;

これは素晴らしいです。ちなみに、ngModelとかなり似ていますね。
親切なユーザー

あんまり。ngModelフォーム統合用です。なしで他のすべての種類のバインディングを実行できますngModel
ギュンターZöchbauer

最後に、ngAfterViewInit実際にインポートせずにどのように使用しましたか?そして実装?それはplunkerの組み込み機能ですか?
親切なユーザー

いいえ、Angularは明示的に宣言されたライフサイクルインターフェースに依存していません。メソッドが存在する場合は呼び出されます。ただし、明示的にインターフェイスを実装することは良い習慣です。
ギュンターZöchbauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.