トランザクション サービス クラス階層

    トランザクション、状態、トランザクション ログ

    トランザクションは、トランザクション サービス の主要な構成要素です。トランザクションは、データに対して実行するすべての操作を指します。Transaction インターフェイスは、3 つのプロパティ (idnewValue、および type を定義します。

    トランザクションの id はデータレコードごとに一意である必要があり、このトランザクションが影響するレコードを定義します。type は、実行する操作に応じて、ADDDELETEUPDATE の 3 つのトランザクションタイプのいずれかになります。newValue には、ADD トランザクションを追加する場合の新しいレコードの値が含まれます。既存のレコードを更新する場合、newValue には変更のみが含まれます。同じ ID の UPDATE タイプのトランザクションが複数あるレコードを削除する場合、newValue には削除されたレコードの値が含まれます。

    各タイプのトランザクションを追加する方法の例は、トランザクションサービスの使用方法のトピックで見ることができます。

    操作 (トランザクション) を実行するたびに、トランザクション ログと取り消しスタックに追加されます。トランザクション ログ内のすべての変更は、レコードごとに蓄積されます。その時点から、サービスは集約された State を維持します。 State は一意のレコードで構成され、すべてのレコードは上記のサポートされているトランザクション タイプのいずれかです。

    トランザクションを追加する際、startPending を呼び出して、保留中のトランザクションをオンにすることができます。endPending を呼び出すまで、後続のトランザクションはすべて単一のトランザクションに蓄積されます。trueendPending に渡すと、蓄積されたすべてのトランザクションがトランザクションログと取り消しスタックに単一のトランザクションとして追加されます。

    igxBaseTransaction の使用

    グリッド モジュールは、トランザクション サービス (igxBaseTransactionService) の非常に基本的な実装を提供し、行編集機能を可能にする保留中のセッション機能のみを提供します。startPendingendPending は、行編集で複数のセルごとの操作を 1 つの変更にまとめることができます。 つまり、1 つのレコードの複数のセルを編集すると、1 つのトランザクションが作成され、行編集イベントのみを処理できます。

    蓄積された状態が部分的なオブジェクトであるため、サービスを使用して、どのセルが編集されたかを確認し、その周りに UI を構築することもできます。

    igxBaseTransactionService には元に戻すスタックがないため、元に戻す/やり直しの機能は提供されません。

    以下のトピックには、行編集を有効にするために igxBaseTransactionService を使用する方法の詳細な例が含まれます。

    igxTransactionService および igxHierarchicalTransactionService に関する一般情報

    igxTransactionServiceigxHierarchicalTransactionService は、Transaction Serviceインターフェイスを実装する注入可能なミドルウェアです。コンポーネントはこれらを使用して、基になるデータに影響を与えることなく変更を蓄積できます。プロバイダーは、accessmanipulate (元に戻すとやり直し)、およびデータへの 1 つまたはすべての変更を破棄またはコミットするための API を公開します。

    より具体的な例では、igxTransactionServiceigxHierarchicalTransactionService は、IgxGrid のセル編集と行編集の両方で機能します。セルが編集モードを終了すると、セル編集のトランザクションが追加されます。行の編集が開始されると、グリッドは startPending を呼び出してトランザクション サービスを保留状態に設定します。編集された各セルは、保留中のトランザクション ログに追加されますが、メイン トランザクション ログには追加されません。行が編集モードを終了すると、すべての変更がメイン トランザクション ログと undo ログに単一のトランザクションとして追加されます。

    いずれのケース (セル編集と行編集) も、グリッド編集の状態は、更新、追加、削除されたすべての行とその最後の状態で構成されます。これらは、後で一度に、または ID ごとに検査、操作、および送信できます。編集モードに応じて、個々のセルまたは行の変更が収集され、データ行/レコードごとに蓄積されます。

    igxTransactionService の使用

    igxTransactionService は、igxBaseTransactionService を拡張します。

    データ操作を行うときにコンポーネントでトランザクションを使用する場合は、igxTransactionService をコンポーネントの providers 配列のプロバイダーとして定義する必要があります。

    igxTransactionService には元に戻すスタックが含まれ、元に戻す/やり直し機能を利用できます。Undo スタックは、実際にはトランザクションの配列を含む配列です。igxTransactionService 使用時に、元に戻すスタックにトランザクションがある場合は、canUndo アクセサーを確認できます。ある場合 undo メソッドを使用して最後のトランザクションを削除し、redo で最後に元に戻したトランザクションを適用します。

    以下のトピックで、バッチ編集を使用した igxGrid の実装方法の詳細な例を見つけることができます。

    igxHierarchicalTransactionService の使用

    igxHierarchicalTransactionService は、igxTransactionService を拡張します。

    igxHierarchicalTransactionService は、親と子の間の関係を処理するように設計されています。(たとえば、igxTreeGrid のように、階層データ構造がある場合にこれを使用します)。 このサービスは、ADD トランザクションを追加するときに期待する場所に新しいレコードが追加されることを保証します。親レコードを削除すると、その子は、実装に応じて、上位レベルの階層に昇格するか、親とともに削除されます。具体的な例として、ツリーグリッドの cascadeOnDelete プロパティを確認できます。値に応じて、親レコードを削除すると、その子に異なる影響があります。

    アプリケーションでは、ユーザーが既に削除された親レコードに子レコードを追加しようとし、トランザクションがコミットされるのを待っている状態を処理することができます。トランザクションサービスでは、削除する親にレコードを追加することはできず、コンソールにエラーメッセージが表示されます。ただし、親を削除するかどうかを確認し、以下のコードを使用してユーザーに独自のアラートを実装できます。

        const state = this.transactions.getState(parentRecordID);
        if (state && state.type === TransactionType.DELETE) {
            // Implement your logic here
        }
    

    以下は、igxTreeGridigxHierarchicalGrid でバッチ編集を実装する方法の詳細な例を含むトピックです。

    トランザクション ファクトリ

    Ignite UI for Angular グリッド内のトランザクションの具体的な実装では、グリッドの batchEditing の値に応じて、適切なトランザクション サービスをインスタンス化するためにファクトリが使用されます。2 つの別々のトランザクション ファクトリがあります - IgxFlatTransactionFactory (GridHierarchical Grid に使用) と IgxHierarchicalTransactionFactory (Tree Grid に使用)。どちらのクラスも、適切なタイプの新しいインスタンスを返す 1 つのメソッド create のみを公開します。渡されたパラメータ (TRANSACTION_TYPE) は内部で使用されます - batchEditingfalse の場合は None が使用され、一括編集が有効な場合は Base が使用されます。展開できるため、(true - false フラグの代わりに) enum が使用されます。

    トランザクション ファクトリの使用

    IgxFlatTransactionFactoryIgxHierarchicalTransactionFactory はどちらも root で提供され、パブリック API で公開されます。任意のチェックに応じて、トランザクション サービスの新しいインスタンスをインスタンス化する場合は、トランザクション ファクトリを使用できます。

    以下の例では、任意の (hasUndo) フラグに応じてさまざまなトランザクション サービスをインスタンス化する方法を確認できます。

    import { IgxFlatTransactionFactory, TRANSACTION_TYPE } from 'igniteui-angular';
    
    export class MyCustomComponent {
        ...
        constructor(private transactionFactory: IgxFlatTransactionFactory) {}
        ...
        public transaction!: IgxTransactionService<Transaction, State>;
    
        public set hasUndo(val: boolean) {
            if (val) {
                this.transactions = this.transactionFactory.create(TRANSACTION_TYPE.Base);
            } else {
                this.transactions = this.transactionFactory.create(TRANSACTION_TYPE.None);
            }
        }
    }
    

    独自のカスタム実装を提供するために、両方のファクトリ クラスを ( providers 配列を使用して) DI 階層で拡張およびオーバーライドできます。これは、ファクトリによってインスタンス化されるすべてのクラスもパブリックであるという事実と相まって、トランザクション実装を内部で使用するコンポーネントに提供されるものを大幅に制御できます。

    たとえば、IgxGridComponent によって内部的に使用されるトランザクション サービスをオーバーライドするには、次のようにします:

    まず、カスタム ファクトリ クラスを定義します。

    import { IgxFlatTransactionFactory, TRANSACTION_TYPE, IgxBaseTransactionService,
    TransactionService, Transaction, State } from 'igniteui-angular';
    
    class CustomTransactionService extends IgxBaseTransactionService {
        ...
    }
    
    export class CustomTransactionFactory extends IgxFlatTransactionFactory {
        ...
        create(type: TRANSACTION_TYPE): TransactionService<Transaction, State> {
            if (type === TRANSACTION_TYPE.Base) {
                return new CustomTransactionService();
            }
            super.create(type);
        }
    }
    

    次に、コンポーネントの providers 配列で、IgxFlatTransactionFactory (igx-grid によって使用される) をカスタム実装でオーバーライドします。

    import { IgxFlatTransactionFactory } from 'igniteui-angular';
    import { CustomTransactionFactory } from '../custom-factory.ts';
    
    @Component({
        selector: 'app-grid-view',
        template: `<igx-grid [batchEditing]="true" [data]="data" [autoGenerate]="true"></igx-grid>`,
        providers: [{ provide: IgxFlatTransactionFactory, useClass: CustomTransactionFactory }]
    })
    
    export class GridViewComponent {
        ...
    }
    

    これで、batchEditingtrue に設定されている場合、グリッドは CustomTransactionService のインスタンスを受け取ります。

    その他のリソース