Hierarquia de classe do Serviço de Transação

    Transaction, State, Transaction Log

    A Transação é o principal bloco de construção do serviço de Transação. A Transação é, na verdade, toda operação que você executa nos dados. ATransaction interface define três propriedades:id,newValue etype.

    Oid da Transação deve ser único por registro de dados e define o registro que essa transação está afetando. Podetype ser qualquer um dos três tipos de transação:ADD eDELETEUPDATE, dependendo da operação que você executa. ElenewValue contém o valor do novo registro caso você esteja adicionando umaADD transação. Se você estiver atualizando um registro existente, elesnewValue conterão apenas as alterações. Você pode ter várias transações doUPDATE mesmo tipo com o mesmo ID. Se você está deletando um registro, onewValue dele conterá o valor do registro deletado.

    Você pode ver um exemplo de como adicionar cada tipo de transação no tópico Como usar o serviço de transação.

    Toda vez que você adiciona uma Transação, ela é adicionada ao registro de transações e à pilha de desfazer. Todas as alterações no registro de transações são então acumuladas por registro. A partir desse ponto, o serviço mantém um agregadoState. ConsisteState em registros únicos e cada registro pode ser de um dos tipos de transação suportados, mencionados acima.

    Ao adicionar transações, você pode ativarstartPending as transações pendentes ligando. Todas as transações subsequentes serão acumuladas em uma única transação até você ligarendPending. Se você passartrue paraendPending todas as transações acumuladas, será adicionada como uma única transação no registro de transações e na pilha de desfazer.

    Using igxBaseTransaction

    Nosso módulo grid oferece uma implementação muito básica do serviço de Transação (igxBaseTransactionService), com funcionalidade de sessão apenas pendente permitindo o recurso de Edição de Fileiras. UsandostartPending eendPending Row, a edição pode combinar múltiplas operações por célula em uma única alteração. Isso significa que editar múltiplas células de um único registro cria uma única transação e você pode lidar apenas com o evento de edição de linha.

    Como o estado acumulado é um objeto parcial, também podemos usar o serviço para verificar qual célula foi editada e criar uma interface de usuário em torno disso.

    EleigxBaseTransactionService não tem pilha de desfazer, então não oferece funcionalidade de desfazer/refazer.

    Um exemplo detalhado de como você pode usarigxBaseTransactionService para habilitar a Edição de Linhas é fornecido nos seguintes tópicos:

    General information on igxTransactionService and igxHierarchicalTransactionService

    igxTransactionServiceeigxHierarchicalTransactionService são middlewars injetáveis, que implementam aTransaction Service interface. Um componente pode usar esses dados para acumular mudanças sem afetar os dados subjacentes. O provedor expõe a API para acesso, manipulação (desfazer e refazer) e descartar ou comprometer uma ou todas as alterações nos dados.

    Em um exemplo mais concreto,igxTransactionService eigxHierarchicalTransactionService pode funcionar tanto com edição de células quanto com edição de linhas doIgxGrid. A transação para a edição da célula é adicionada quando a célula sai do modo de edição. Quando astartPending edição de linha começa, a grade coloca seu serviço de transação em estado pendente ao chamar. Cada célula editada é adicionada ao registro de transações pendentes e não é adicionada ao registro principal de transações. Quando a linha sai do modo de edição, todas as mudanças são adicionadas ao log principal de transações e ao log de desfazer como uma única transação.

    Em ambos os casos (edição de células e edição de linhas), o estado das edições da grade consiste em todas as linhas atualizadas, adicionadas e excluídas e seus últimos estados. Elas podem ser inspecionadas, manipuladas e enviadas posteriormente de uma vez ou por id. As alterações são coletadas para células ou linhas individuais, dependendo do modo de edição, e acumuladas por linha/registro de dados.

    Using igxTransactionService

    igxTransactionServiceseigxBaseTransactionService estende.

    Se você quer que seu componente use transações ao operar dados, precisa definir oigxTransactionService como um provedor no array doproviders seu componente.

    EleigxTransactionService oferece uma pilha de desfazer para que você possa aproveitar a funcionalidade de desfazer/refazer. A pilha de Desfazer é, na verdade, um array que contém arrays de transações. Ao usar issoigxTransactionService, você pode verificar ocanUndo acessório para entender se há alguma transação na pilha de Desfazer. Se houver, você pode usar oundo método para remover a última transação eredo aplicar a última transação desfeita.

    Você pode encontrar um exemplo detalhado de como o igxGrid com edição em lote é implementado no seguinte tópico:

    Using igxHierarchicalTransactionService

    igxHierarchicalTransactionServiceseigxTransactionService estende.

    OigxHierarchicalTransactionService é projetado para lidar com as relações entre pais e filhos (use isso quando você tem uma estrutura de dados hierárquica, como, por exemploigxTreeGrid). O serviço garante que um novo registro será adicionado ao local que você espera ao adicionar umaADD transação. Quando você exclui um registro pai, seus filhos serão promovidos para um nível superior de hierarquia, ou serão excluídos junto com o pai, dependendo da implementação. Você pode ver acascadeOnDelete propriedade da grade de árvore para um exemplo concreto – dependendo do valor, excluir um registro pai terá efeitos diferentes em seus filhos.

    Em seu aplicativo, você pode querer lidar com o cenário em que o usuário tenta adicionar um registro filho a um registro pai que já foi excluído e está esperando a transação ser confirmada. O Transaction Service não permitirá adicionar um registro a um pai que deve ser excluído e uma mensagem de erro será exibida no Console. No entanto, você pode verificar se um pai deve ser excluído e implementar seu próprio alerta para o usuário usando o seguinte código:

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

    Você pode encontrar exemplos detalhados de comoigxTreeGrid eigxHierarchicalGrid com a Edição em Batch são implementados nos seguintes tópicos:

    Transaction Factory

    Na implementação concreta de transações dentro de Ignite UI for Angular grades, uma fábrica é usada para instanciar o serviço de transação adequado, dependendo do valor da gradebatchEditing. Existem duas fábricas de transações separadas - asIgxFlatTransactionFactory (usadas paraGrid e)Hierarchical Grid eIgxHierarchicalTransactionFactory (usadas para Tree Grid). Ambas as classes expõem apenas um método —createque retorna uma nova instância do tipo correto. O parâmetro passed (TRANSACTION_TYPE) é usado internamente -Noneé usado quandobatchEditing é falso eBase- quando a edição em lote está habilitada. Umenum é usado (em vez de a-flagtruefalse), pois permite ser expandido.

    Using Transaction Factory

    TantoIgxFlatTransactionFactory quantoIgxHierarchicalTransactionFactory são fornecidos eroot expostos na API pública. Se você quiser instanciar uma nova instância de um serviço de transação, dependendo de algum cheque arbitrário, pode usar uma fábrica de transações.

    No exemplo abaixo, você pode ver como pode instanciar diferentes serviços de transação dependendo de uma flag arbitrária (hasUndo):

    import { IgxFlatTransactionFactory, TRANSACTION_TYPE } from 'igniteui-angular/core';
    // import { IgxFlatTransactionFactory, TRANSACTION_TYPE } from '@infragistics/igniteui-angular'; for licensed package
    
    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);
            }
        }
    }
    

    Ambas as classes de fábrica podem ser estendidas e sobrescrevidas na hierarquia DI (usando oproviders array) para fornecer sua própria implementação personalizada. Isso, combinado com o fato de que todas as classes instanciadas pelas fábricas também são públicas, te dá muito controle sobre o que é fornecido aos componentes que usam implementações de transações internamente.

    Por exemplo, para sobrescrever o serviço de transação usado internamente pelo oIgxGridComponent, você pode fazer o seguinte:

    Primeiro, defina uma classe de fábrica personalizada

    import { IgxFlatTransactionFactory, TRANSACTION_TYPE, IgxBaseTransactionService,
    TransactionService, Transaction, State } from 'igniteui-angular/core';
    // import { IgxFlatTransactionFactory, TRANSACTION_TYPE, IgxBaseTransactionService,
    // TransactionService, Transaction, State } from '@infragistics/igniteui-angular'; for licensed package
    
    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);
        }
    }
    
    

    Depois, no array doproviders seu componente, substitua oIgxFlatTransactionFactory (usado porigx-grid) com sua implementação personalizada.

    import { IgxFlatTransactionFactory } from 'igniteui-angular/core';
    // import { IgxFlatTransactionFactory } from '@infragistics/igniteui-angular'; for licensed package
    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 {
        ...
    }
    

    Agora, quandobatchEditing está definido paratrue, a grade receberá uma instância deCustomTransactionService.

    Additional Resources