[解決済み】*ngIfの@ViewChild
2022-03-27 11:40:53
質問
質問
を取得する最もエレガントな方法は何ですか?
@ViewChild
が表示された後、そのテンプレート内の対応する要素が表示されますか?
以下はその例です。また プランカー が利用できます。
Component.template.html。
<div id="layout" *ngIf="display">
<div #contentPlaceholder></div>
</div>
Component.component.ts。
export class AppComponent {
display = false;
@ViewChild('contentPlaceholder', { read: ViewContainerRef }) viewContainerRef;
show() {
this.display = true;
console.log(this.viewContainerRef); // undefined
setTimeout(() => {
console.log(this.viewContainerRef); // OK
}, 1);
}
}
デフォルトでコンテンツが非表示になっているコンポーネントがあります。誰かが
show()
メソッドで表示されるようになります。しかし、Angular 2の変更検出が完了する前に、私はこのメソッドを参照することができません。
viewContainerRef
. 私は通常、必要なアクションをすべて
setTimeout(()=>{},1)
のようにします。もっと正しい方法はないのでしょうか?
というオプションがあるのは知っています。
ngAfterViewChecked
しかし、無駄な呼び出しが多すぎる。
ANSWER(プランカー)
解決方法は?
ViewChildのセッターを使用します。
private contentPlaceholder: ElementRef;
@ViewChild('contentPlaceholder') set content(content: ElementRef) {
if(content) { // initially setter gets called with undefined
this.contentPlaceholder = content;
}
}
セッターは要素の参照で一度だけ呼び出されます。
*ngIf
が
true
.
注:Angular 8 では、必ず
{ static: false }
これは他のバージョンのAngularではデフォルトの設定です。
@ViewChild('contentPlaceholder', { static: false })
注意: contentPlaceholder がコンポーネントである場合、ElementRef をコンポーネントの Class に変更することができます。
private contentPlaceholder: MyCustomComponent;
@ViewChild('contentPlaceholder') set content(content: MyCustomComponent) {
if(content) { // initially setter gets called with undefined
this.contentPlaceholder = content;
}
}
関連
-
[解決済み] Angular 2の@ViewChildアノテーションがundefinedを返す
-
[解決済み] エラーです。参照または変数に代入できません! Angular 4 [重複]の場合
-
[解決済み] モジュール 'AppModule' によってインポートされた予期しないディレクティブ 'LoginComponent' があります。NgModuleアノテーションを追加してください。
-
[解決済み] Angular 6でmouseoverとmouseoutを使用する方法
-
[解決済み] NGIf else "の使い方を教えてください。
-
[解決済み】TemplateRefのプロバイダがない! (NgIf ->TemplateRef)
-
[解決済み】Angularの@ViewChild()のエラーです。2つの引数を期待したが、1つを得た
-
[解決済み】Angular 8の@ViewChildの新しい静的なオプションはどのように使用すればよいですか?
-
[解決済み】@ViewChildと@ContentChildの違いは何ですか?
-
[解決済み】*ngIfと*ngForが同じ要素にあるとエラーになる件
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular 2の@ViewChildアノテーションがundefinedを返す
-
[解決済み] 型 '{}' は型 '{ title: string; text: string; }' に代入できません。
-
[解決済み] 未定義のプロパティ 'filter' を読み取ることができません。
-
[解決済み] プロパティ 'json' はタイプ 'Object' に存在しません。
-
[解決済み] Angular 6 Error trying to diff '[object Object]'. 配列と反復記号のみが許可されます。
-
[解決済み] Angular2 Selectorが、ネストしたComponentのどの要素にもマッチしない。
-
[解決済み] Angular2の素材ダイアログに問題あり - @NgModule.entryComponentsに追加しましたか?
-
[解決済み] モジュール 'ngx-cookie-service' が見つかりません。
-
[解決済み] ローカルホストが私のアンギュラーアプリに対して無効な応答を送信しました。
-
[解決済み] AngularでKendo Tabstripのタブを閉じるボタンを実装する方法