Встроенный Power BI — ошибка при вызове powerbi.embed()

#javascript #c# #powerbi #powerbi-embedded

#javascript #c# #пауэрби #powerbi-встроенный

Вопрос:

Я пытаюсь встроить простой отчет Power BI в ASP web (.NET Core) с помощью контроллеров. Я уже правильно получил embedToken, embedURL и ReportId, но когда я пытаюсь вызвать powerbi.embed() для инициализации отчета, я получаю следующую ошибку:

 "ncaught TypeError: this.element.getAttribute is not a function
at e.t.getUniqueId (powerbi.min.js:2)
at e.t.populateConfig (powerbi.min.js:2)
at e.t (powerbi.min.js:2)
at new e (powerbi.min.js:5)
at t.embedNew (powerbi.min.js:2)
at t.embedInternal (powerbi.min.js:2)
at t.embed (powerbi.min.js:2)
at Object.<anonymous> (my-extension.js:125)
at u (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)"
 

Я пробовал embeddtoken, embedUrls и ReportId в Power BI embed Playground, и они работают нормально, но я получаю эту проблему в коде. Я считаю, что проблема может заключаться в powerbi.js файл, но я также пробовал использовать разные файлы, из пакета nugget и GitHub, и у меня все еще та же проблема.

Я оставил код для получения токенов и инициализации отчета Power BI ниже:

JS-файл для инициализации отчета и вызова API для получения токенов: рассматривайте MyPanel как простую всплывающую панель свойств:

 this._button.onClick = (ev) => {
        this._enabled = !this._enabled;
        this._button.setState(this._enabled ? 0 : 1);
         //Execute an action here
         //if null, create docking panel

        if (this.panel == null) {
            this.panel = new MyPanel(this.viewer, this.viewer.container, 'myPanel', 'My Panel');
            this.panel.addVisibilityListener((show) => {
                this._button.setState(show ? 0 : 1);
            });
        }
        var request = jQuery.ajax({
            url: '/api/forge/PBI/url'
        });

        request.done(function (data) {
            console.log(data);
            // Read embed application token from textbox
            var txtAccessToken = data.accessToken;

            // Read embed URL from textbox
            var txtEmbedUrl = data.embedUrl;

            // Read report Id from textbox
            var txtEmbedReportId = data.reportId;

            var models = window['powerbi-client'].models;
            var permissions = models.Permissions.All;

            var config = {
                type: 'report',
                tokenType: models.TokenType.Embed,
                accessToken: txtAccessToken,
                embedUrl: txtEmbedUrl,
                id: txtEmbedReportId,
                permissions: permissions,
                settings: {
                    panes: {
                        filters: {
                            visible: true
                        },
                        pageNavigation: {
                            visible: true
                        }
                    }
                }
            };
            var div = $('#PowerBIEmbed');
            var report = powerbi.embed(div, config);
            
        });
 

Файлы C # для получения токенов в ответ на запрос API:

 [ApiController]
public class PowerBi : ControllerBase
{

    [HttpGet]
    [Route("/api/forge/PBI/url")]
    public EmbedConfig  GetPBIToken()
    {
        EmbedConfig pBIData =  PBICredentials.GetEmbedToken();
        return pBIData;          
    }


}


public class PBICredentials
{
    public static EmbedConfig GetEmbedToken()
    {
        var a = new Configurations();
        using (var client = new PowerBIClient(new Uri(Configurations.ApiUrl), 
                Authentication.GetTokenCredentials()))
        {
            // Retrieve the selected Report
            var Reports = client.Reports.GetReportsInGroup(Configurations.WorkspaceId);
            var Report = Reports.Value.FirstOrDefault();

            // Generate an embed token to view
            var generateTokenRequestParameters = new GenerateTokenRequest(TokenAccessLevel.View);
            var tokenResponse = client.Reports.GenerateTokenInGroup(Configurations.WorkspaceId, 
                 Report.Id, generateTokenRequestParameters);

            // Populate embed variables (to be passed client-side)
            EmbedConfig embed = new EmbedConfig()
            {
                AccessToken = tokenResponse.Token,
                EmbedUrl = Report.EmbedUrl,
                ReportId = Report.Id
            };

            return embed;
        }
    }

}

public class EmbedConfig
{
    [JsonPropertyName("accessToken")]
    public string AccessToken { get; set; }

    [JsonPropertyName("embedUrl")]
    public string EmbedUrl { get; set; }

    [JsonPropertyName("reportId")]
    public Guid ReportId { get; set; }
}
 

Рассмотрим файл аутентификации и конфигурацию, как в курсе «Разработчики за один день» от Microsoft Power BI: https://www.youtube.com/playlist?list=PL1N57mwBHtN1AGWHnJMhtvJCIG_IlC07D

Любая помощь будет отблагодарена!

С наилучшими пожеланиями,

Карлос

Ответ №1:

Вы получаете сообщение об ошибке в строке ниже:

 var div = $('#PowerBIEmbed');
 

Вам нужно получить ссылку на первый элемент внутри div массива.
Измените приведенную выше строку на:

 var div = $('#PowerBIEmbed')[0];
// or
var div = $('#PowerBIEmbed').get(0);
 

Пожалуйста, найдите ссылку здесь: https://docs.microsoft.com/javascript/api/overview/powerbi/embed-report#example