「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Angular テーブルのサイズ変更可能な列をマスターする: 開発者のためのステップバイステップ ガイド

Angular テーブルのサイズ変更可能な列をマスターする: 開発者のためのステップバイステップ ガイド

2024 年 11 月 8 日に公開
ブラウズ:229

Mastering Resizable Columns in Angular Table: A Step-by-Step Guide for Developers

Angular テーブルでサイズ変更可能な列を作成する方法: ステップバイステップ ガイド

Angular マテリアル テーブルは、データを表示する洗練された方法を提供します。ただし、ユーザーはデータ表示をより適切に制御するためにテーブル列のサイズを変更する機能などの追加機能を必要とすることがよくあります。このガイドでは、カスタム ディレクティブを使用して Angular テーブルにサイズ変更可能な列を作成するプロセスについて説明します。ディレクティブを設定し、サイズ変更機能をスタイルし、列のサイズ変更を実装する方法を段階的に学習します。

導入

サイズ変更可能な列を Angular マテリアル テーブルに追加するには、マウス イベントをリッスンするカスタム ディレクティブを作成する必要があり、ユーザーが列をクリックしてドラッグして幅を調整できるようになります。これにより、特に大規模なデータセットを扱う場合にユーザーに柔軟性が与えられ、ユーザー エクスペリエンスが向上します。

このチュートリアルでは次のことを行います:

  • カスタム列サイズ変更ディレクティブを作成します。
  • マウス イベントを処理して列のサイズを変更します。
  • スムーズなユーザー エクスペリエンスのためにスタイルを適用します。
  • ディレクティブを Angular マテリアル テーブルにアタッチします。

詳しく見ていきましょう。

ステップ 1: Angular マテリアル テーブルのセットアップ

まず、Angular プロジェクトに Angular マテリアルがインストールされていることを確認します。そうでない場合は、次のコマンドを実行して Angular マテリアルをプロジェクトに追加します:

ng add @angular/material

Angular マテリアルがインストールされたら、次のコードを使用して基本的なテーブルを作成できます。

テーブルの HTML:

{{ column }} {{ element[column] }}

ここでは、Angular Materials の mat-table を使用して、単純なテーブルを表示します。 appColumnResize ディレクティブは th (ヘッダー) 要素に適用され、列のサイズを変更可能になります。

テーブルのデータ:

import { Component, ViewEncapsulation } from '@angular/core';

export interface PeriodicElement {
  name: string;
  position: number;
  weight: number;
  symbol: string;
}

const ELEMENT_DATA: PeriodicElement[] = [
  { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H' },
  { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He' },
  // ... add more data
];

@Component({
  selector: 'table-basic-example',
  styleUrls: ['table-basic-example.scss'],
  templateUrl: 'table-basic-example.html',
  encapsulation: ViewEncapsulation.None,
})
export class TableBasicExample {
  displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
  dataSource = ELEMENT_DATA;
}

コンポーネントには周期要素のデータが含まれており、これをテーブルに表示します。

ステップ 2: 列サイズ変更ディレクティブの作成

次に、テーブル列のサイズ変更機能を有効にするカスタム Angular ディレクティブを実装します。

ディレクティブの実装:

import {
  Directive,
  ElementRef,
  Renderer2,
  NgZone,
  Input,
  OnInit,
  OnDestroy,
} from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

@Directive({
  selector: '[appColumnResize]',
})
export class ColumnResizeDirective implements OnInit, OnDestroy {
  @Input() resizableTable: HTMLElement | null = null;

  private startX!: number;
  private startWidth!: number;
  private isResizing = false;
  private column: HTMLElement;
  private resizer!: HTMLElement;
  private destroy$ = new Subject();

  constructor(
    private el: ElementRef,
    private renderer: Renderer2,
    private zone: NgZone
  ) {
    this.column = this.el.nativeElement;
  }

  ngOnInit() {
    this.createResizer();
    this.initializeResizeListener();
  }

  private createResizer() {
    this.resizer = this.renderer.createElement('div');
    this.renderer.addClass(this.resizer, 'column-resizer');
    this.renderer.setStyle(this.resizer, 'position', 'absolute');
    this.renderer.setStyle(this.resizer, 'right', '0');
    this.renderer.setStyle(this.resizer, 'top', '0');
    this.renderer.setStyle(this.resizer, 'width', '5px');
    this.renderer.setStyle(this.resizer, 'cursor', 'col-resize');
    this.renderer.appendChild(this.column, this.resizer);
  }

  private initializeResizeListener() {
    this.zone.runOutsideAngular(() => {
      fromEvent(this.resizer, 'mousedown')
        .pipe(takeUntil(this.destroy$))
        .subscribe((event: MouseEvent) => this.onMouseDown(event));

      fromEvent(document, 'mousemove')
        .pipe(takeUntil(this.destroy$))
        .subscribe((event: MouseEvent) => this.onMouseMove(event));

      fromEvent(document, 'mouseup')
        .pipe(takeUntil(this.destroy$))
        .subscribe(() => this.onMouseUp());
    });
  }

  private onMouseDown(event: MouseEvent) {
    event.preventDefault();
    this.isResizing = true;
    this.startX = event.pageX;
    this.startWidth = this.column.offsetWidth;
  }

  private onMouseMove(event: MouseEvent) {
    if (!this.isResizing) return;
    const width = this.startWidth   (event.pageX - this.startX);
    this.renderer.setStyle(this.column, 'width', `${width}px`);
  }

  private onMouseUp() {
    if (!this.isResizing) return;
    this.isResizing = false;
  }

  ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
  }
}

説明:

  • createResizer(): サイズ変更要素 (div) を列ヘッダーに追加します。
  • onMouseDown(): ユーザーがリサイザをクリックするとトリガーされ、初期位置が記録されます。
  • onMouseMove(): ユーザーがサイズ変更ツールをドラッグすると、列の幅が更新されます。
  • onMouseUp(): ユーザーがマウス ボタンを放したときにサイズ変更を終了します。

ステップ 3: リサイザーのスタイル設定

ドラッグ可能であることがユーザーにわかるように、サイズ変更ツールのスタイルを設定する必要があります。次の CSS をスタイルに追加します:

.resizable-table {
  th {
    position: relative;

    .column-resizer {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      width: 10px;
      cursor: col-resize;
      z-index: 1;

      &:hover {
        border-right: 2px solid red;
      }
    }

    &.resizing {
      user-select: none;
    }
  }

  &.resizing {
    cursor: col-resize;
    user-select: none;
  }
}

この CSS は、サイズ変更機能を正しく配置し、ホバー効果を追加し、サイズ変更可能であることを示すようにカーソルを変更します。

ステップ 4: テーブルのテスト

ディレクティブとスタイルが設定されたので、列のサイズを変更してみます。サイズ変更ツールをクリックして左右にドラッグすると、各列の幅を動的に調整できるはずです。

よくある質問

Q: サイズ変更可能なテーブルの幅が広すぎる場合はどうなりますか?

A: テーブルはオーバーフローし、コンテナの幅に基づいて調整されます。大きなテーブルを処理するには、適切なスクロール動作またはコンテナ調整を追加してください。

Q: 特定の列をサイズ変更不可にできますか?

A: はい、*ngIf.

などの Angular の組み込み構造ディレクティブを使用して、appColumnResize ディレクティブを特定の列のみに条件付きで適用できます。

Q: このアプローチは大きなテーブルのパフォーマンスに優れていますか?

A: このソリューションは中程度のサイズのテーブルに適しています。ただし、非常に大規模なデータセットの場合は、Angular の変更検出戦略または仮想スクロール メカニズムを使用してさらに最適化することが必要になる場合があります。

結論

このガイドに従うことで、Angular マテリアル テーブルのサイズ変更可能な列機能が完全に機能するようになります。このカスタマイズにより、テーブルの柔軟性と使いやすさが向上し、より良いユーザー エクスペリエンスが提供されます。コーディングを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/chintanonweb/mastering-resizable-columns-in-angular-table-a-step-by-step-guide-for-developers-4f5n?1 侵害がある場合、study_golang @163.comdelete までご連絡ください。
最新のチュートリアル もっと>
  • SOAP と REST API: 主な違いを理解する
    SOAP と REST API: 主な違いを理解する
    Web サービスの世界では、SOAP (Simple Object Access Protocol) と REST (Representational State Transfer) の 2 つのアーキテクチャが広く使用されています (SOAP 対 REST API)。どちらもシステム間の通信プロ...
    プログラミング 2024 年 11 月 8 日に公開
  • CSSでテキストの下線の色をカスタマイズするにはどうすればよいですか?
    CSSでテキストの下線の色をカスタマイズするにはどうすればよいですか?
    CSS を使用したテキストの下線の色のカスタマイズWeb デザインでは、情報を強調または強調表示するためにテキストに下線を追加するのが一般的です。ただし、下線の色を変更して独特の雰囲気を加えたい場合はどうすればよいでしょうか。可能ですか?はい、CSS を使用してテキストの下の線の色を変更することがで...
    プログラミング 2024 年 11 月 8 日に公開
  • JavaScript でのクリックジャッキング防御技術の実装
    JavaScript でのクリックジャッキング防御技術の実装
    クリックジャッキングなどの高度な攻撃の出現により、今日のオンライン世界ではセキュリティが主要な問題となっています。攻撃者は、消費者をだまして最初に表示されているものとは異なるものをクリックさせることで、「クリックジャッキング」と呼ばれる悪質な手法を展開し、悲惨な結果をもたらす可能性があります。この種...
    プログラミング 2024 年 11 月 8 日に公開
  • フローティングされた Div が後続の Div のサイズを変更しないのはなぜですか?
    フローティングされた Div が後続の Div のサイズを変更しないのはなぜですか?
    Div のサイズが変更されない Float の謎CSS float を使用する場合、後続の要素は新しい要素に流れるのではなく左に揃えられると想定されます。ライン。ただし、提供されている例など、一部のシナリオでは、次の div が最初の div の右側から始まるのではなく、幅全体に広がり続けます。この...
    プログラミング 2024 年 11 月 8 日に公開
  • Python を使用して MySQL にデータをインポートする
    Python を使用して MySQL にデータをインポートする
    導入 データベースにデータを手動でインポートするのは、特に多数のテーブルがある場合、面倒なだけでなく時間がかかる場合があります。これは、Python ライブラリを使用すると簡単に行うことができます。 kaggle からペイント データセットをダウンロードします。絵画データ セットは...
    プログラミング 2024 年 11 月 8 日に公開
  • 必須の MySQL オペレーターとそのアプリケーション
    必須の MySQL オペレーターとそのアプリケーション
    MySQL 演算子は、開発者にとって重要なツールであり、正確なデータ操作と分析を可能にします。これらは、値の割り当て、データ比較、複雑なパターン マッチングなどのさまざまな機能をカバーします。 JSON データを処理する場合でも、条件に基づいてレコードをフィルタリングする場合でも、効率的なデータベー...
    プログラミング 2024 年 11 月 8 日に公開
  • Cron ジョブをテストする方法: 完全ガイド
    Cron ジョブをテストする方法: 完全ガイド
    Cron ジョブは、タスクのスケジュール設定、プロセスの自動化、および指定された間隔でのスクリプトの実行のために、多くのシステムで不可欠です。 Web サーバーの保守、バックアップの自動化、定期的なデータ インポートの実行など、cron ジョブにより操作がスムーズに実行されます。ただし、他の自動化...
    プログラミング 2024 年 11 月 8 日に公開
  • Next.js ミドルウェアの概要: 例を使用した仕組み
    Next.js ミドルウェアの概要: 例を使用した仕組み
    Nextjs のルーティングについて話しましょう。今日は、最も強力なミドルウェアの 1 つについて説明します。 Nextjs のミドルウェアは、サーバーからのリクエストをインターセプトし、リクエスト フロー (リダイレクト、URL 書き換え) を制御し、認証、ヘッダー、Cookie の永続性などの機...
    プログラミング 2024 年 11 月 8 日に公開
  • 小道具の基本: パート 1
    小道具の基本: パート 1
    これは、プロップの使用方法に関する初心者向けのチュートリアルです。読む前に、分割とは何か、コンポーネントの使用/作成方法を理解することが重要です。 Props (プロパティの略) を使用すると、親コンポーネントから子コンポーネントに情報を送信できます。また、任意のデータ型を使用できることに注意する...
    プログラミング 2024 年 11 月 8 日に公開
  • Hibernate は Spring Boot とどう違うのですか?
    Hibernate は Spring Boot とどう違うのですか?
    Hibernate は Spring Boot とどう違うのですか? Hibernate と Spring Boot は両方とも Java エコシステムで人気のあるフレームワークですが、異なる目的を果たし、異なる機能を備えています。 休止状態 Hibernate は...
    プログラミング 2024 年 11 月 8 日に公開
  • C++ は 10 進データ型をどのように処理できますか?
    C++ は 10 進データ型をどのように処理できますか?
    C の 10 進データ型 C では、数値を処理するためのさまざまなデータ型が提供されていますが、驚くべきことに、10 進データ型はネイティブではサポートされていません。これは、正確な 10 進数値を扱う場合、または 10 進形式を利用するシステムとインターフェイスする場合に制限となる可能性があります...
    プログラミング 2024 年 11 月 8 日に公開
  • Python の Caesar 暗号関数で最後にシフトされた文字だけが表示されるのはなぜですか?
    Python の Caesar 暗号関数で最後にシフトされた文字だけが表示されるのはなぜですか?
    Python の Caesar 暗号関数: 暗号化された文字列Python で Caesar Cipher 関数を実装する場合、最終的な暗号化されたテキストが暗号化されるという一般的な問題が発生します。最後にシフトされた文字のみを表示します。これを解決するには、この動作の原因となっている問題を理解す...
    プログラミング 2024 年 11 月 8 日に公開
  • 4 での PHP の迅速な導入
    4 での PHP の迅速な導入
    Servbay は、開発環境を簡単に構成するための主要なツールとしての地位を確立しています。このガイドでは、PHP 8.2 を迅速かつ安全に導入する方法を示し、導入プロセスの簡素化に対する Servbay の取り組みを強調します。 前提条件 始める前に、Servbay がデバイスにイ...
    プログラミング 2024 年 11 月 8 日に公開
  • replace プロパティが AngularJS ディレクティブで非推奨になったのはいつですか?
    replace プロパティが AngularJS ディレクティブで非推奨になったのはいつですか?
    AngularJS がディレクティブの replace プロパティを非推奨にした理由AngularJS ディレクティブの replace プロパティは、その複雑さとより優れたプロパティの出現により非推奨になりました代替案。公式 AngularJS API ドキュメントによると、将来のバージョンではデ...
    プログラミング 2024 年 11 月 8 日に公開
  • JavaScript および jQuery で PHP 変数にシームレスにアクセスするにはどうすればよいですか?
    JavaScript および jQuery で PHP 変数にシームレスにアクセスするにはどうすればよいですか?
    JavaScript または jQuery での PHP 変数へのアクセス: エコー オーバーロードの回避多くの開発者は、JavaScript や jQuery で PHP 変数にアクセスするという課題に直面しています。従来の方法では、次のように PHP タグ内の変数をエコーし​​ます。<?p...
    プログラミング 2024 年 11 月 8 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3