Compartilhar via


Como "renderizar" eventos em visuais do Power BI

Para tornar um visual certificado, ele precisa incluir eventos de renderização. Esses eventos permitem que os ouvintes (principalmente, exportar para PDF e exportar para PowerPoint) saibam quando o visual está sendo renderizado e quando ele está pronto para exportação.

Importante

Qualquer visual que exporte dados (por exemplo, para um arquivo do PowerPoint ou .pdf) deve conter eventos de renderização para garantir que a exportação não comece antes de a renderização do visual ser concluída.

A API de eventos de renderização consiste em três métodos que devem ser chamados durante a renderização:

  • renderingStarted: o código do visual do Power BI chama o método renderingStarted para indicar que o processo de renderização foi iniciado. Esse método sempre deve ser a primeira linha do método update, pois é aí que o processo de renderização começa.

  • renderingFinished: quando a renderização for concluída com êxito, o código visual do Power BI chamará o método para notificar os ouvintes de que a imagem do visual renderingFinished está pronta para exportação. Esse método deve ser a última linha de código executada quando o visual é atualizado. Normalmente (mas nem sempre) ele é a última linha do método update.

  • renderingFailed: se ocorrer um problema durante o processo de renderização, o visual do Power BI não será renderizado com êxito. Para notificar os ouvintes de que o processo de renderização não foi concluído, o código do visual do Power BI deve chamar o método renderingFailed. Esse método também fornece uma cadeia de caracteres opcional para informar um motivo para a falha.

Observação

Os eventos de renderização são um requisito para a certificação de visuais. Sem eles, o seu visual não será aprovado pelo Partner Center para publicação. Para obter mais informações, confira requisitos de certificação.

Como usar a API de eventos de renderização

Para chamar os métodos de renderização, primeiro você precisa importá-los do IVisualEventService.

  1. Em seu arquivo visual.ts, inclua a linha:

    import IVisualEventService = powerbi.extensibility.IVisualEventService;
    
  2. Na classe IVisual, inclua a linha:

    private events: IVisualEventService;
    
  3. No método constructor da classe IVisual

    this.events = options.host.eventService;
    

Agora você pode chamar os métodos this.events.renderingStarted(options);, this.events.renderingFinished(options); e this.events.renderingFailed(options); quando apropriado em seu método update.

Exemplo 1: visual sem animações

Aqui está um exemplo de um visual simples que usa a API de renderização de eventos.

    export class Visual implements IVisual {
        ...
        private events: IVisualEventService;
        ...

        constructor(options: VisualConstructorOptions) {
            ...
            this.events = options.host.eventService;
            ...
        }

        public update(options: VisualUpdateOptions) {
            this.events.renderingStarted(options);
            ...
            this.events.renderingFinished(options);
        }

Exemplo 2: visual sem animações

Se o visual tiver animações ou funções assíncronas para renderização, o método renderingFinished deverá ser chamado após a animação ou dentro da função assíncrona, mesmo que essa não seja a última linha do método update.

    export class Visual implements IVisual {
        ...
        private events: IVisualEventService;
        private element: HTMLElement;
        ...

        constructor(options: VisualConstructorOptions) {
            ...
            this.events = options.host.eventService;
            this.element = options.element;
            ...
        }

        public update(options: VisualUpdateOptions) {
            this.events.renderingStarted(options);
            ...
            // Learn more at https://github.com/d3/d3-transition/blob/master/README.md#transition_end
            d3.select(this.element).transition().duration(100).style("opacity","0").end().then(() => {
                // renderingFinished called after transition end
                this.events.renderingFinished(options);
            });
        }