[解決済み】Angular 8の@ViewChildの新しい静的なオプションはどのように使用すればよいですか?
質問
Angular 8の新しいビューチャイルドはどのように設定すればよいですか?
@ViewChild('searchText', {read: ElementRef, static: false})
public searchTextInput: ElementRef;
対
@ViewChild('searchText', {read: ElementRef, static: true})
public searchTextInput: ElementRef;
どっちがいい?どのような場合に
static:true
対
static:false
?
解決方法は?
ほとんどの場合
{static: false}
. このように設定することで、バインディングの解決に依存するクエリのマッチング (構造的なディレクティブのような) が確実に行われます。
*ngIf, etc...
が見つかります。
を使用する場合の例
static: false
:
@Component({
template: `
<div *ngIf="showMe" #viewMe>Am I here?</div>
<button (click)="showMe = !showMe"></button>
`
})
export class ExampleComponent {
@ViewChild('viewMe', { static: false })
viewMe?: ElementRef<HTMLElement>;
showMe = false;
}
は
static: false
は、Angular 9のデフォルトのフォールバック動作になる予定です。もっと読む
こちら
と
こちら
は
{ static: true }
オプションは、埋め込みビューをオンザフライで作成することをサポートするために導入されました。ビューを動的に作成する際に
TemplateRef
を使用した場合、そのようなことはできません。
ngAfterViewInit
を発生させるので
ExpressionHasChangedAfterChecked
というエラーが発生します。staticフラグをtrueに設定すると、ngOnInitでビューが作成されます。
それにしても。
その他のほとんどの場合、ベストプラクティスは
{static: false}
.
ただし
{ static: false }
オプションは、Angular 9でデフォルトになります。つまり、静的フラグを設定する必要はないのです。
static: true
オプションを使用します。
を使用することで、アンギュラークリ
ng update
コマンドを使用すると、現在のコードベースを自動的にアップグレードすることができます。
移行ガイドとこれに関するさらに詳しい情報については こちら および こちら
<ブロッククオート#スタティッククエリとダイナミッククエリの違いは何ですか? ViewChild() および @ContentChild() クエリの static オプションは、 クエリの結果がいつ利用可能になるかを決定します。
静的クエリ (static: true) では、ビューが作成されるとクエリが解決されますが、変更検出が実行される前に解決されます。しかし、その結果は、ngIfやngForブロックへの変更など、ビューへの変更を反映するために更新されることはありません。
<ブロッククオート動的クエリ(static: false)では、@ViewChild() と @ContentChild() それぞれについて ngAfterViewInit() または ngAfterContentInit() の後でクエリが解決されます。結果は、ngIfやngForブロックへの変更など、ビューへの変更に対して更新されます。
を使用した素敵なユースケースです。
static: true
を使用している場合です。
fromEvent
を使用して、テンプレートで定義された要素にバインドします。次のようなテンプレートを考えてみましょう。
<div [ngStyle]="thumbStyle$ | async" #thumb></div>
そうすると、サブスクリプションやinitフックを使わなくても、この要素のイベントを処理できるようになります(angularイベントバインディングを使いたくない、あるいは使えない場合)。
@Component({})
export class ThumbComponent {
@ViewChild('thumb', { static: true })
thumb?: ElementRef<HTMLElement>;
readonly thumbStyle$ = defer(() => fromEvent(this.thumb, 'pointerdown').pipe(
switchMap((startEvent) => fromEvent(document, 'pointermove', { passive: true })
// transform to proper positioning
));
}
を使用することが重要です。
defer
. これは、observableが購読されたときだけ解決されることを確認します。これは
ngAfterViewInit
がトリガーされると
async
パイプがそれを購読します。なぜなら、私たちは
static: true
を使用すると
this.thumb
はすでに入力されています。
関連
-
[解決済み】serveコマンドを使用するには、angular-cliプロジェクト内にいる必要があります。
-
[解決済み] node_modules が空になったので、`npm install`を実行する必要があるかもしれない。
-
[解決済み】Angular2エラー。exportAs "が "ngForm "に設定されたディレクティブは存在しません。
-
[解決済み] Angular 2 ルーターベースなし href = "/stock/stock_detail.html?
-
[解決済み] ReferenceError: localStorageが定義されていません。
-
[解決済み] ag-gridで「表示する行がありません」テキストをプログラムで変更するにはどうすればよいですか?
-
[解決済み] モジュール "ionic-native" が見つかりません。
-
[解決済み] なぜ mat-tables matRowDef は 2 つの変数を含むのですか?
-
[解決済み] Angularアプリのシンタックスエラー。予期しないトークン <
-
[解決済み] viewchildを使用して複数のviewchildrenにアクセスする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] @viewChildが機能しない - プロパティnativeElementがundefinedで読み込めない
-
[解決済み】angularモジュールでModule has no exported memberエラー
-
[解決済み] 型 '{}' は型 '{ title: string; text: string; }' に代入できません。
-
[解決済み] ngForにフィルターをかけるには?
-
[解決済み] Typescript - コードが TS1128: Declaration or Statement expected というエラーでビルドに失敗するが、コードを提供すると期待通りに実行される。
-
[解決済み] Uncaught (in promise): Ionic 2でcordova_not_available。
-
[解決済み] ag-gridで「表示する行がありません」テキストをプログラムで変更するにはどうすればよいですか?
-
[解決済み] Angular 6 Error trying to diff '[object Object]'. 配列と反復記号のみが許可されます。
-
[解決済み] ブレークポイントの解除 - VS Code | Chrome | Angular
-
[解決済み] Angular2 Selectorが、ネストしたComponentのどの要素にもマッチしない。