Как разработать расширение Qlik Sense, которое работает в гибридных приложениях с несколькими приложениями

Мое расширение не работает в гибридных приложениях, которые загружают объекты из нескольких приложений.

Кажется, это работает, когда мое расширение из приложения, которое сначала загружается Qlik Sense. Но если мое расширение находится в двух разных приложениях, одно из них работает, а другое — нет.


person HerrJohr    schedule 04.02.2019    source источник


Ответы (1)


TL;DR

Не используйте:

qlik.currApp()

Используйте

qlik.currApp(this)

чтобы ваше расширение поддерживало использование в мэшапах с несколькими приложениями.

Подробное объяснение

Если вам нужно вызвать функции в приложении за объектом расширения, вы, вероятно, используете qlik.currApp();

qlik.currApp() дает вам текущее загруженное приложение. Это нормально, если в мэшап загружено только одно приложение. Но если есть несколько приложений, qlik.currApp() просто дает вам первое загруженное приложение.

Согласно Документация Qlik Sense по методу currApp:

qlik.currApp(ссылка)

Получает ссылку на текущее приложение. Используйте метод currApp в расширении, чтобы получить ссылку на отображаемое в данный момент приложение.

Изображение у вас есть два приложения: A и B. A загружается первым. Затем вы также включаете объект из приложения B в мэшап. Но тип объекта — расширение, и это расширение использует qlik.currApp(), вполне вероятно, что этот объект не будет работать должным образом. Это расширение будет вызывать функции в приложении А, даже если оно из приложения Б.

Вы можете указать Qlik, на какое приложение вы хотите сослаться. Для этого вам нужна ссылка на экземпляр расширения. Вы получаете это как ссылку this внутри вашего метода рисования в коде расширения:

paint: function(§element, layout){
    var app = qlik.currApp(this);
    // [...]
}

Если у вас есть другое замыкание внутри функции рисования, вам нужно сохранить ссылку this. В противном случае ссылка this перезаписывается внутренним объектом функции. Распространенным случаем является сохранение ссылки this на that:

paint: function(§element, layout){
    var that = this;

    loader.load(assets, function(){
        var app = qlik.currApp(that);
        // [...]
    });
}
person HerrJohr    schedule 04.02.2019
comment
Если вы используете AngularJS, аргумент равен $scope.$parent, например. var app = qlik.currApp($scope.$parent). - person pschiffmann; 20.01.2020