События отрисовки в визуальных элементах Power BI

Чтобы получить визуальную сертификацию, она должна включать события отрисовки. Эти события позволяют прослушивателям (в первую очередь экспортировать в PDF-файлы и экспортировать в PowerPoint) знать, когда визуальный элемент отрисовывается и когда он готов к экспорту.

Внимание

Любой визуальный элемент, экспортируемый (например, в Файл PowerPoint или .pdf ), должен содержать события отрисовки, чтобы экспорт не начинался до завершения визуализации.

API событий отрисовки состоит из трех методов вызова во время отрисовки:

  • renderingStarted: вызовите этот метод, чтобы указать, что запущена отрисовка. Всегда вызывайте этот метод в качестве первой строки метода обновления, так как начинается процесс отрисовки.

  • renderingFinished: вызовите этот метод при успешном выполнении отрисовки, чтобы уведомить прослушивателей о готовности изображения визуального элемента к экспорту. Этот вызов должен быть последней строкой кода, которая выполняется при обновлении визуального элемента. Обычно это, но не всегда, последняя строка метода обновления.

  • renderingFailed: вызовите этот метод, если проблема возникает во время отрисовки, чтобы уведомить прослушивателей о том, что отрисовка не завершена. Можно передать необязательную строку, чтобы указать причину сбоя.

Примечание.

События отрисовки являются обязательными для сертификации визуальных элементов. Без них визуальный элемент не будет утвержден Центром партнеров для публикации. Дополнительные сведения см. в разделе "Требования к сертификации".

Использование API событий отрисовки

Чтобы вызвать методы отрисовки IVisualEventService , сначала импортируйте тип.

  1. visual.ts В файле добавьте следующий импорт:

    import IVisualEventService = powerbi.extensibility.IVisualEventService;
    
  2. В классе добавьте частное IVisual поле:

    private events: IVisualEventService;
    
  3. В методе constructorIVisual класса инициализируйте поле:

    this.events = options.host.eventService;
    

Теперь вы можете вызвать this.events.renderingStarted(options);и this.events.renderingFinished(options);this.events.renderingFailed(options); в случае необходимости в методе обновления.

Жизненный цикл событий отрисовки

Следуйте этим правилам в каждом update() цикле:

  1. Вызов renderingStarted при запуске отрисовки.
  2. Вызовите ровно один метод завершения для этого цикла:
    • renderingFinished При успешной отрисовке или
    • renderingFailed При сбое отрисовки.
  3. Для асинхронной отрисовки вызов выполняется renderingFinished только после завершения отрисовки.

Внимание

Не позволяйте методу update() выйти без сигнала завершения. После вызова renderingStartedнеобходимо всегда вызывать или renderingFinishedrenderingFailed.

Шаблоны реализации кода

Синхронное обновление с обработкой сбоев

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

Асинхронное обновление с обработкой сбоев

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

Цепочка обещаний с .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;
    });
}