私はブートストラップを持つコンポーネントを持っていますnav-tabs
要素。 コンポーネントはngFor
で使用されているため、動的IDを持っています。 IDは、@Input
オブジェクトに依存するため、OnInit
ハンドラで指定されます。テンプレート要素への角2の動的アクセス
すべてのタブのclick
イベントにアタッチされているコンポーネントのメソッドがあります。これは、クリック順序に応じてスクロールバーとタブ要素を拡張するやや複雑なロジックを処理します。つまり、テンプレート要素にはaddClass
とremoveClass
のメソッドが必要です。
このロジックをテンプレートhtmlに直接実装する方法は簡単ではありません。それはあまりにも複雑です。
私は@ViewChild
要素を調べましたが、クリックハンドラで動的に使用できないため、ここでは該当しません。私はコンポーネントレベルで定義する必要がありますが、その時点で私のIDはまだ与えられていません。
クリックハンドラでテンプレート要素に動的にアクセスしてクラスを追加または削除するには、どのような方法が最適ですか。
リクエストに応じて、ここではクリックハンドラのロジックを示します。概念の証明として私はdocument
アクセスを使用しますが、それは明らかに行く方法ではありません。
public toggleOverflow (id: string): void
{
let i = this.endsWith(id, "1") ? 0 : 1;
let anyOpen = this.tabActive[0].open || this.tabActive[1].open;
if (!anyOpen)
{
document.getElementById(this.containerId).classList.remove("movie-info-overflow");
document.getElementById(this.onTopId).classList.add("ontop");
}
if (!this.tabActive[i].open)
{
this.tabActive[i].open = true;
this.tabActive[i].id = id;
document.getElementById(id).classList.add("scroll");
if (anyOpen)
{
// close currently open tab
i = Math.abs(i - 1);
this.tabActive[i].open = false;
document.getElementById(this.tabActive[i].id).classList.remove("scroll");
}
}
else
{
this.tabActive[i].open = false;
document.getElementById(id).classList.remove("scroll");
document.getElementById(this.containerId).classList.add("movie-info-overflow");
document.getElementById(this.onTopId).classList.remove("ontop");
}
}
タブには、リストの次の要素をカバーしないように、最初はテキストの一部しか表示されません。クリックしたときにのみ、スクロールバーをテキスト(クラスscroll
)に追加し、タブをzオーダー(クラスontop
)に高く設定すると、フルテキストが表示されます。
ご覧のとおり、click
イベントを引き起こした要素だけでなく、隣接するタブ要素にもアクセスする必要があります。
テンプレートの関連部分:
<ul class="nav nav-tabs movie-tabs">
<li class="active"><a [attr.href]="'#' + tabId1" data-toggle="tab" (click)="toggleOverflow(tabId1)">Description</a></li>
<li ng-if="movie.comments.length > 0"><a [attr.href]="'#' + tabId2" data-toggle="tab" (click)="toggleOverflow(tabId2)">Comments</a></li>
</ul>
<div [attr.id]="onTopId" class="tab-content">
<div [attr.id]="tabId1" class="tab-pane movie-tab active">
<p class="movie-description">{{movie.description}}</p>
</div>
<div [attr.id]="tabId2" class="tab-pane movie-tab">
<p class="movie-description">{{movie.comments}}</p>
</div>
</div>
達成しようとしていることを示すコードを追加してください。あなたの説明から私はあいまいな画像しか得ることができません。 –
フェッチするこれらの要素はどこにありますか。あなたはテンプレートの一部を追加してください。 –
これは '[ngClass] =" .. "'や '[class.scroll] =" ... "'で解決するのが簡単です。要素にアクセスして変更する代わりに、モデルを変更し、テンプレートのバインディングを使用して、モデルの変更に応じてクラスやスタイルを追加/削除する必要があります。 –