"Renderização" de eventos em visuais do Power BI

Para obter uma certificação visual, ela deve incluir eventos de renderização. Esses eventos permitem que os ouvintes (principalmente, exportem para PDF e exportem para PowerPoint) saibam quando o visual está sendo renderizado e quando está pronto para exportação.

Importante

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

A API de eventos de renderização consiste em três métodos a chamar durante a renderização:

  • renderingStarted: Chame este método para indicar que a renderização começou. Chama sempre este método como a primeira linha do teu método de atualização, pois é aí que começa o processo de renderização.

  • renderingFinished: Chame este método quando a renderização for concluída com sucesso, para notificar os ouvintes que a imagem do visual está pronta para exportação. Esta chamada deve ser a última linha de código que corre quando o visual atualiza. Normalmente, mas nem sempre, é a última linha do método de atualização.

  • renderingFailed: Chame este método se ocorrer um problema durante a renderização, para notificar os ouvintes que a renderização não foi concluída. Podes passar uma string opcional para dar uma razão para a falha.

Nota

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

Como usar a API de eventos de renderização

Para chamar os métodos de renderização, primeiro importa o IVisualEventService tipo.

  1. No seu visual.ts ficheiro, adicione a seguinte importação:

    import IVisualEventService = powerbi.extensibility.IVisualEventService;
    
  2. Na IVisual aula, adiciona um campo privado:

    private events: IVisualEventService;
    
  3. No constructor método da IVisual classe, inicialize o campo:

    this.events = options.host.eventService;
    

Agora pode chamar this.events.renderingStarted(options);, this.events.renderingFinished(options);, e this.events.renderingFailed(options); quando apropriado no seu método de atualização .

Ciclo de vida do evento de renderização

Siga estas regras em todos os update() ciclos:

  1. Chama renderingStarted quando começar a renderização.
  2. Chame exatamente um método de completação para esse ciclo:
    • renderingFinished quando a renderização tem sucesso, ou
    • renderingFailed quando a renderização falha.
  3. Para renderização assíncrona, chamar renderingFinished apenas depois de a renderização estar verdadeiramente concluída.

Importante

Não deixe o update() método sair sem sinalizar conclusão. Depois de ligar renderingStarted, deve sempre ligar ou renderingFinishedrenderingFailed.

Padrões de implementação de código

Atualização síncrona com gestão de falhas

public update(options: VisualUpdateOptions): void {
  this.host.eventService.renderingStarted(options);

  try {
    this.renderView(options); // visual rendering logic
    this.host.eventService.renderingFinished(options);
  } catch (error) {
    this.host.eventService.renderingFailed(options, String(error));
    throw error;
  }
}

Atualização assíncrona com gestão de falhas

public async update(options: VisualUpdateOptions): Promise<void> {
  this.host.eventService.renderingStarted(options);

  try {
    await this.renderAsync(options); // visual rendering logic
    this.host.eventService.renderingFinished(options);
  } catch (error) {
    this.host.eventService.renderingFailed(options, String(error));
    throw error;
  }
}

Cadeia de promessas com .then().catch()

public update(options: VisualUpdateOptions): void {
  this.host.eventService.renderingStarted(options);

  this.renderAsync(options) // visual rendering logic
    .then(() => {
      this.host.eventService.renderingFinished(options);
    })
    .catch((error) => {
      this.host.eventService.renderingFailed(options, String(error));
      throw error;
    });
}