Condividi tramite


Eventi di "rendering" negli oggetti visivi di Power BI

Per ottenere un oggetto visivo certificato, questo deve includere eventi di rendering. Questi eventi consentono ai listener (principalmente: esportare in PDF ed esportare in PowerPoint) di sapere quando viene eseguito il rendering dell'oggetto visivo e quando è pronto per l'esportazione.

Importante

Qualsiasi oggetto visivo che esporta dati (ad esempio in un file di PowerPoint o .pdf), deve contenere eventi di rendering per assicurare che l'esportazione non abbia inizio prima del completamento del rendering dell'oggetto visivo.

L'API degli eventi di rendering è costituita da tre metodi da chiamare durante il rendering:

  • renderingStarted: Chiamare questo metodo per indicare che il rendering è stato avviato. Chiamare sempre questo metodo come prima riga del metodo update, dal momento che inizia il processo di rendering.

  • renderingFinished: Chiamare questo metodo al termine del rendering per notificare ai listener che l'immagine dell'oggetto visivo è pronta per l'esportazione. Questa chiamata deve essere l'ultima riga di codice eseguita quando l'oggetto visivo viene aggiornato. In genere, ma non sempre, è l'ultima riga del metodo di aggiornamento.

  • renderingFailed: chiamare questo metodo se si verifica un problema durante il rendering, per notificare ai listener che il rendering non è stato completato. È possibile passare una stringa facoltativa per fornire un motivo per l'errore.

Nota

Gli eventi di rendering sono un requisito per la certificazione degli oggetti visivi. Senza di essi l'oggetto visivo non verrà approvato dal Centro per i partner per la pubblicazione. Per altre informazioni, vedere Requisiti di certificazione.

Come usare l'API degli eventi di rendering

Per chiamare i metodi di rendering, importare prima di tutto il IVisualEventService tipo.

  1. visual.ts Nel file aggiungere l'importazione seguente:

    import IVisualEventService = powerbi.extensibility.IVisualEventService;
    
  2. IVisual Nella classe aggiungere un campo privato:

    private events: IVisualEventService;
    
  3. constructor Nel metodo della IVisual classe inizializzare il campo:

    this.events = options.host.eventService;
    

È ora possibile chiamare this.events.renderingStarted(options);, this.events.renderingFinished(options);e this.events.renderingFailed(options); dove appropriato nel metodo update .

Ciclo di vita degli eventi di rendering

Seguire queste regole in ogni update() ciclo:

  1. Chiamare renderingStarted all'avvio del rendering.
  2. Chiamare esattamente un metodo di completamento per il ciclo:
    • renderingFinished quando il rendering ha esito positivo o
    • renderingFailed quando il rendering ha esito negativo.
  3. Per il rendering asincrono, chiamare renderingFinished solo dopo il completamento del rendering.

Importante

Non lasciare che il metodo venga chiuso senza segnalare il update() completamento. Dopo aver chiamato renderingStarted, è necessario chiamare renderingFinished sempre o renderingFailed.

Modelli di implementazione del codice

Aggiornamento sincrono con gestione degli errori

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;
  }
}

Aggiornamento asincrono con gestione degli errori

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;
  }
}

Catena di promesse con .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;
    });
}