<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>extension - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<atom:link href="https://qliksense.ivan-shamaev.ru/tag/extension/feed/" rel="self" type="application/rss+xml" />
	<link>https://qliksense.ivan-shamaev.ru/tag/extension/</link>
	<description>Qlik Sense на русском языке. Пошаговые уроки для изучения Клик Сенс</description>
	<lastBuildDate>Mon, 01 May 2023 15:08:55 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://qliksense.ivan-shamaev.ru/wp-content/uploads/2018/07/QlikSense_ICON2-150x150.png</url>
	<title>extension - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<link>https://qliksense.ivan-shamaev.ru/tag/extension/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Доступ к системным данным и переменным в Extension Qlik Sense</title>
		<link>https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/</link>
					<comments>https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Mon, 21 Feb 2022 06:57:50 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[Building visualization extensions]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[Methods Qlik Sense Extension API]]></category>
		<category><![CDATA[Доступ к системным переменным]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2759</guid>

					<description><![CDATA[<p>Введение Иногда при создании расширения Qlik Sense вам необходимо получить доступ к системным данным. Это особенно актуально, если вы пытаетесь создать что-то более общее. Возможно, вам нужен список полей, измерений или показателей. Или вам нужно работать с переменными. Если вы новичок в разработке Qlik Sense, вы можете посмотреть в документации<a class="moretag" href="https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/">Доступ к системным данным и переменным в Extension Qlik Sense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Введение</h2>
<span>Иногда при создании расширения Qlik Sense вам необходимо получить доступ к системным данным. Это особенно актуально, если вы пытаетесь создать что-то более общее. Возможно, вам нужен список полей, измерений или показателей. Или вам нужно работать с переменными.</span>

<span>Если вы новичок в разработке Qlik Sense, вы можете посмотреть в документации по API способы получения необходимых данных. </span>

<strong><span>Не делай этого !!! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f615.png" alt="😕" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </span></strong>

<span>Модель расширения Qlik Sense основана на идее использования одного универсального объекта, описанного в расширениях <strong>initialProperties</strong> и измененного пользователем на панели свойств и, возможно, программно (но это действительно продвинуто). Таким образом, хотя использование методов API для получения дополнительных данных является одним из описанных подходов в Qlik Help, которые используются в гибридных приложениях или веб-приложения и обращаются к данным Qlik, вам следует избегать их использования в mashups.</span>
<h2><span>Почему не нужно использовать вызовы API</span></h2>
<span>Если вы используете эти вызовы API в своем расширении, у вас возникнут проблемы:</span>
<ul>
 	<li><span>вы можете легко получить утечку памяти или «утечку общих объектов», когда вы создаете множество общих объектов.</span></li>
 	<li><span>вы можете легко потерять контроль над всеми работающими функциями обратного вызова при повторной проверке общих объектов.</span></li>
 	<li><span>если пользователь делает снимок, вызовы API будут обращаться к последней версии данных, а не к той, что в снимке, и, возможно, дадут неправильные данные.</span></li>
 	<li><span>если пользователь попытается экспортировать ваше расширение в PDF или Excel, оно может сломаться, поскольку служба, отвечающая за этот экспорт, не имеет доступа к оперативным данным, а только к моментальному снимку.</span></li>
</ul>
<span>Если вам абсолютно необходимо использовать эти вызовы, вы должны по крайней мере включить экспорт в PDF и Excel и не разрешать моментальные снимки вашего расширения.</span>
<h2><span>Что нужно делать вместо этого</span></h2>
<span>К счастью, есть альтернативы. Все эти вызовы API создают общие объекты, но, поскольку общий объект является очень гибкой структурой, вы можете фактически настроить общий объект за своим расширением для предоставления необходимых вам данных. Вот небольшая таблица того, что вы можете использовать:</span>
<table id="tablepress-1" class="tablepress tablepress-id-1">
<thead>
<tr class="row-1 odd">
<th class="column-1"><strong>Что нужно</strong></th>
<th class="column-2"><strong>Не использовать вызов API</strong></th>
<th class="column-3"><strong>Вместо этого добавьте в initialProperties</strong></th>
</tr>
</thead>
<tbody class="row-hover">
<tr class="row-2 even">
<td class="column-1">List of fields</td>
<td class="column-2">app.getList(&#8220;FieldList&#8221;)</td>
<td class="column-3">qFieldListDef</td>
</tr>
<tr class="row-3 odd">
<td class="column-1">List of measures</td>
<td class="column-2">app.getList(&#8220;MeasureList&#8221;)</td>
<td class="column-3">qMeasureListDef</td>
</tr>
<tr class="row-4 even">
<td class="column-1">List of dimensions</td>
<td class="column-2">app.getList(&#8220;DimensionList&#8221;)</td>
<td class="column-3">qDimensionListDef</td>
</tr>
<tr class="row-5 odd">
<td class="column-1">List of variables</td>
<td class="column-2">app.getList(&#8220;VariableList&#8221;)</td>
<td class="column-3">qVariableListDef</td>
</tr>
<tr class="row-6 even">
<td class="column-1">Variable value</td>
<td class="column-2">app.variable.getContent(..)</td>
<td class="column-3">qStringExpression or
qValueExpression</td>
</tr>
</tbody>
</table>
<span>Вы найдете рабочий пример этого в репозитории  </span><a href="https://github.com/erikwett/syslist"><span>расширении системного списка, </span></a><span> просто не используйте его, он предназначен как пример того, как получить данные и на самом деле не делает ничего полезного. Но возьмите ту часть initialProperties, которая вам нужна для расширения.</span>

<strong>Это выглядит так:</strong>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">initialProperties: {
                moneyFormat: {
                    qStringExpression: '=MoneyFormat'
                },
                qMeasureListDef: {
                    qType: "measure",
                    qData: {
                        qMeasure: "/qMeasure"
                    }
                },
                qDimensionListDef: {
                    qType: "dimension",
                    qData: {
                        qDim: "/qDim",
                        qDimInfos: "/qDimInfos"
                    }
                },
                qVariableListDef: {
                    qType: "variable",
                    qShowReserved: true,
                    qShowConfig: true
                },
                qFieldListDef: {
                    qShowSystem: true,
                    qShowHidden: true,
                    qShowSemantic: true,
                    qShowSrcTables: true,
                    qShowDerivedFields: true,
                    qShowImplicit: true
                }
            }</pre>
<h2><span>Когда следует использовать эти вызовы API</span></h2>
<span>Ну нет правил без исключений. Хотя вам следует избегать использования этих вызовов в API для части рендеринга вашего расширения, вы должны использовать их на своей панели свойств, если вам, например, нужно предоставить список полей пользователю. А в мэшапе они определенно очень полезны. И у API есть другие вызовы, которые вы, возможно, захотите использовать, но в основном это когда пользователь что-то делает, например, нажимает кнопку и т.д.</span>
<h2>Источник</h2>
https://extendingqlik.upper88.com/accessing-system-data-and-variables-in-a-qlik-sense-extension/<div class="learnpress"><div
	class="learn-press-message error lp-content-area">Этот шорткод LP Profile должен использоваться только на странице <a href="https://qliksense.ivan-shamaev.ru/wp-admin/admin.php?page=learn-press-settings"><strong>Учетная запись</strong></a></div>
</div>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/">Доступ к системным данным и переменным в Extension Qlik Sense</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/accessing-system-data-and-variables-in-a-qlik-sense-extension/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qlik Web Developer &#8211; Backend API для разработки Extensions</title>
		<link>https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Sat, 16 Jan 2021 12:42:03 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[Backend API]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[extension api]]></category>
		<category><![CDATA[Qlik Sense Extension]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<category><![CDATA[Qlik Web Developer]]></category>
		<category><![CDATA[Методы Qlik Sense Extension API]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2530</guid>

					<description><![CDATA[<p>Введение в Qlik Sense Backend API Backend API состоит из ряда методов и используется для взаимодействия с ассоциативным механизмом Qlik. Он предоставляет вспомогательные функции для вызовов ассоциативного механизма Qlik и доступ к данным ассоциативного механизма Qlik. Backend API &#8211; это оболочка для выбранных методов Qlik Engine JSON API, но с той разницей, что Backend API знает контекст, то есть<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/">Qlik Web Developer &#8211; Backend API для разработки Extensions</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Введение в Qlik Sense Backend API</h1>
<p><span><strong>Backend API</strong> состоит из ряда методов и используется для взаимодействия с </span><span class="CommonComponentsEngineName"><span>ассоциативным механизмом Qlik</span></span><span>. Он предоставляет вспомогательные функции для вызовов </span><span class="CommonComponentsEngineName"><span>ассоциативного механизма Qlik</span></span><span> и доступ к данным </span><span class="CommonComponentsEngineName"><span>ассоциативного механизма Qlik</span></span><span>. </span></p>
<p><span><strong>Backend API</strong> &#8211; это оболочка для выбранных методов <span class="CommonComponentsProtocolName"><strong>Qlik Engine JSON API</strong>,</span> но с той разницей, что Backend API знает контекст, то есть текущее соединение <strong>WebSocket</strong> и приложение <span class="CommonComponentsQlik Sense">Qlik Sense</span>.</span></p>
<p><span>Backend API доступен для разработчиков расширений как </span><code><span class="syntax"><span>this.backendApi</span></span></code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.eachDataRow(function(rownum, row) {
    .....
});</pre>
<h2>Примеры использования</h2>
<h3>Selections</h3>
<p><span>Следующие методы <strong>Backend API</strong> доступны, когда вы работаете с выборками в универсальном объекте, стоящем за вашим расширением.</span></p>
<ul>
<li><code><span class="syntax">selectValues</span></code></li>
<li><code><span class="syntax">selectRange</span></code></li>
<li><code><span class="syntax">clearSelections</span></code></li>
<li><code><span class="syntax">hasSelections</span></code></li>
</ul>
<p><span>Используйте метод </span><code><span class="syntax"><span>selectValues</span></span></code><span> для выбора значений в этом объекте. Вызов вызывает перерисовку объекта.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">$element.find('li').on('click', function() {
    if(this.hasAttribute("data-value")) {
        var value = parseInt(this.getAttribute("data-value"), 10), dim = 0;
        self.backendApi.selectValues(dim, [value], true);
    }
});</pre>
<p><span>Метод </span><code><span class="syntax"><span>selectRange</span></span></code><span> выбирает значения в этом объекте, используя диапазоны.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var range = {
    "qMeasureIx": 1,
    "qRange": {
        "qMin": 10,
        "qMax": 100,
        "qMinInclEq": true,
        "qMaxInclEq": true
    }
};
self.backendApi.selectRange( [range], false);</pre>
<p><span>Метод </span><code><span class="syntax"><span>hasSelections</span></span></code><span> можно использовать, чтобы узнать, есть ли неподтвержденные выборы для этого объекта.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.hasSelections();</pre>
<p><span>Если для этого объекта есть неподтвержденные выборки, вы можете использовать метод </span><span class="syntax"><span><code>clearSelections</code>,</span></span><span> чтобы очистить их.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.clearSelections();</pre>
<h3>Search</h3>
<p><span>При работе с поиском в объектах списка вы можете использовать следующие методы Backend API.</span></p>
<ul>
<li><code><span class="syntax">search</span></code></li>
<li><code><span class="syntax">acceptSearch</span></code></li>
<li><code><span class="syntax">abortSearch</span></code></li>
</ul>
<p><span>Используйте </span><span>метод </span><span class="syntax"><code>search</code> </span><span>для поиска термина в <strong>list object</strong>. Это приводит к обновленному <strong>layout</strong>, который содержит только совпадающие записи.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.search("A");</pre>
<p><span>Метод </span><code><span class="syntax"><span>acceptSearch</span></span></code><span> принимает результат поиска и делает его выбранным в поле.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.acceptSearch(false);</pre>
<p><span>Используйте метод </span><span class="syntax"><span><code>abortSearch</code>,</span></span><span> если поиск должен быть прерван. Это очищает существующий поиск и возвращает объект в состояние, в котором он находился до поиска.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">this.backendApi.abortSearch();</pre>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/">Qlik Web Developer &#8211; Backend API для разработки Extensions</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qlik-extensions-web-development-backend-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Отладка visualization extension с помощью web developer tools</title>
		<link>https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Fri, 15 Jan 2021 21:37:39 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[extension api]]></category>
		<category><![CDATA[Qlik Sense Extension]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<category><![CDATA[Отладка QS Extension]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2520</guid>

					<description><![CDATA[<p>Отладка с помощью инструментов веб-разработчика Исторически сложилось так, что разработчики JavaScript часто использовали alert() для целей отладки, но это может восприниматься как раздражающее, поэтому вместо этого рекомендуется использовать console.log() для отправки данных в консоль браузера. Инструменты веб-разработчика Большинство веб-браузеров предлагают какой-то инструмент разработчика, но в этом разделе вы познакомитесь с некоторыми основными концепциями, основанными на Google<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/">Отладка visualization extension с помощью web developer tools</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><madcap:concept term="Building visualization extensions" xmlns:madcap="http://www.madcapsoftware.com/Schemas/MadCap.xsd"><span>Отладка с помощью инструментов веб-разработчика</span></madcap:concept></h1>
<p><span>Исторически сложилось так, что разработчики JavaScript часто использовали </span><code><span class="syntax"><span>alert()</span></span></code><span> для целей отладки, но это может восприниматься как раздражающее, поэтому вместо этого рекомендуется использовать </span><code><span class="syntax"><span>console.log()</span></span></code><span> для отправки данных в консоль браузера.</span></p>
<h2 id="anchor-1" tabindex="-1"><span>Инструменты веб-разработчика</span></h2>
<p><span>Большинство веб-браузеров предлагают какой-то инструмент разработчика, но в этом разделе вы познакомитесь с некоторыми основными концепциями, основанными на Google Chrome.</span></p>
<h3><span>Инструменты разработчика в вашем браузере</span></h3>
<p><span>Если вы разрабатываете расширения визуализации с помощью </span><strong><span class="CommonComponentsSenseDesktopName">Qlik Sense Desktop</span></strong><span>, вы можете использовать свой любимый браузер для целей отладки. Просто откройте </span><span class="CommonComponentsSenseDesktopName"><span>Qlik Sense Desktop</span></span><span> и оставьте его открытым. Затем откройте свой браузер и перейдите по </span><span class="path"><span>адресу <strong><a href="http://localhost:4848" target="_blank" rel="noopener">http://localhost:4848</a></strong></span></span><span>. Отобразится Hub, и оттуда вы сможете открыть инструменты разработчика браузера.</span></p>
<h3><span>Инструменты разработчика из </span><span class="CommonComponentsSenseDesktopName"><span>Qlik Sense Desktop</span></span></h3>
<p><span>Поскольку </span><span class="CommonComponentsSenseDesktopName"><span>Qlik Sense Desktop</span></span><span> использует Chromium в качестве встроенного браузера, вы можете получить доступ к Chrome DevTools из </span><span class="CommonComponentsSenseDesktopName"><span>Qlik Sense Desktop</span></span><span>. Нажмите </span><span class="ui_item_external"><span>Ctrl + Shift</span></span><span> и одновременно щелкните правой кнопкой мыши по листу, а затем выберите «</span><span class="ui_item_external"><span>Показать DevTools»</span></span><span> в диалоговом окне.</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift.jpg"><img fetchpriority="high" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift.jpg" alt="" width="1358" height="473" class="aligncenter size-full wp-image-2523" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift.jpg 1358w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift-300x104.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift-1024x357.jpg 1024w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qlik_sense_devtools_ctrl_shift-768x267.jpg 768w" sizes="(max-width: 1358px) 100vw, 1358px" /></a></p>
<p><strong>Откроется окно devtools</strong></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/devtools_qlik_sense_desktop_using.jpg"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/devtools_qlik_sense_desktop_using.jpg" alt="" width="938" height="774" class="aligncenter size-full wp-image-2525" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/devtools_qlik_sense_desktop_using.jpg 938w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/devtools_qlik_sense_desktop_using-300x248.jpg 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/devtools_qlik_sense_desktop_using-768x634.jpg 768w" sizes="(max-width: 938px) 100vw, 938px" /></a></p>
<h2 id="anchor-2" tabindex="-1"><span>Отладка с помощью Chrome DevTools</span></h2>
<p><span>В этом разделе выделены три области, которые имеют большое значение при разработке расширений визуализации:</span></p>
<ul>
<li><span>Использование console</span></li>
<li>Inspect elements</li>
<li>Debugging</li>
</ul>
<h3><span>Использование консоли</span></h3>
<p><span>Как упоминалось выше, удобнее использовать console в веб DevTools вместо запуска предупреждений. Для этого используйте </span><code><span class="syntax"><span>console.info</span></span></code><span> или </span><span class="syntax"><span><code>console.log</code>,</span></span><span> чтобы передать что-нибудь в консоль.</span></p>
<p class="example" data-mc-autonum="Example: "><strong><span class="autonumber">Пример: </span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">paint: function ( $element, layout ) {

    var err = {
        message: 'Something went wrong',
        errCode: 'bla'
    };

    console.info( 'We are re-painting the extension' );
    console.error( 'Oops, we haven an error', err );
    console.log( 'We are here' );
    console.log( 'layout', layout );

}</pre>
<p><span>Рекомендуется потратить некоторое время на изучение более сложных концепций <code>console</code>, например:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">console.assert();
console.group();
console.groupCollapsed();
console.groupEnd();
console.table();</pre>
<h4><span>Некоторые соображения</span></h4>
<p><span>Функции </span><strong><span class="syntax">console.<span style="color: #333333;">xyz</span>()</span></strong><span> поддерживаются не всеми веб-браузерами, поэтому рекомендуется убедиться, что в коде не осталось </span><span class="syntax"><span><strong>console.xyz()</strong>,</span></span><span> когда он попадет в рабочую среду. Для этого есть несколько стратегий:</span></p>
<ul>
<li><span>Вручную удалите все </span><strong><span class="syntax">console.xyz()</span></strong><span> из кода перед развертыванием в производственной среде.</span></li>
<li><span>Оберните все ваши вызовы в консоль, чтобы они выполнялись только в том случае, если текущий веб-браузер поддерживает консольные вызовы.</span></li>
<li><span>Используйте инструменты, например <strong>Grunt</strong> или <strong>Gulp</strong>, для создания процесса развертывания, в котором все операторы консоли удаляются автоматически.</span></li>
</ul>
<h3>Inspect elements (<span>Осмотрите элементы)</span></h3>
<p><span>Манипуляции с объектной моделью документа (DOM) можно просмотреть с помощью инспектора элементов, который встречается в большинстве инструментов веб-разработчика. В Chrome DevTools вы получаете доступ к функции проверки элементов, щелкнув увеличительное стекло на панели инструментов.</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/ui_extension_inspect_element_chrome_devtools.png"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/ui_extension_inspect_element_chrome_devtools.png" alt="" width="280" height="62" class="aligncenter size-full wp-image-2521" /></a></p>
<h3><span>Отладка</span></h3>
<p><span>Вы можете использовать developer tools для отладки в реальном времени, например:</span></p>
<ul>
<li><span>Chrome DevTools</span></li>
<li><span>Firebug</span></li>
<li><span>Инструменты разработчика F12 для Internet Explorer</span></li>
</ul>
<p>Для того, чтобы запустить режим debugging в расширении, необходимо написать команду <code>debugger;</code>.</p>
<p><strong>Пример:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">paint: function($element, layout) {
    
    console.log(layout);
    
    var hypercube = layout.qHyperCube;
    
    console.log(hypercube);
    
    debugger;
}</pre>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/">Отладка visualization extension с помощью web developer tools</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qlik-extension-debugging-and-web-developer-tools/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Обзор Extension API и описание методов расширений</title>
		<link>https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/</link>
					<comments>https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Sat, 09 Jan 2021 20:42:37 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[extension api]]></category>
		<category><![CDATA[Methods Qlik Sense Extension API]]></category>
		<category><![CDATA[Qlik Sense Extension]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<category><![CDATA[Методы Qlik Sense Extension API]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2494</guid>

					<description><![CDATA[<p>Введение в Extension API Extension API состоит из методов и свойств, используемых для создания custom расширений визуализации (или custom visualization extensions). Обзор Visualization extension templates Для начала рассмотрим шаблоны Visualization extension templates. В dev-hub при создании Extension вам предлагают выбрать шаблон. Basic Visualization template Назовем наш Extension &#8220;1_BVT&#8221;. При инициализации<a class="moretag" href="https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/">Обзор Extension API и описание методов расширений</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Введение в Extension API</h1>
<p><span><strong>Extension API</strong> состоит из методов и свойств, используемых для создания custom расширений визуализации (или <strong>custom visualization extensions</strong>).</span></p>
<h2>Обзор Visualization extension templates</h2>
<p>Для начала рассмотрим шаблоны <strong>Visualization extension templates</strong>. В <strong>dev-hub</strong> при создании Extension вам предлагают выбрать шаблон.</p>
<h3>Basic Visualization template</h3>
<p>Назовем наш Extension <strong>&#8220;1_BVT&#8221;</strong>. При инициализации создадутся два файла:</p>
<p><strong>1_BVT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "1_BVT",
    "description": "Basic empty visualization template",
    "type": "visualization",
    "version": "1.0.0",
    "icon": "extension",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>1_BVT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [ "qlik"
],
function ( qlik) {

    return {
        support : {
            snapshot: true,
            export: true,
            exportData : false
        },
        paint: function ($element) {
            //add your rendering code here
            $element.html( "1_BVT" );
            //needed for export
            return qlik.Promise.resolve();
        }
    };

} );</pre>
<h3>Chart Template</h3>
<p>Назовем наш Extension <strong>&#8220;2_CT&#8221;</strong>. При инициализации создадутся 4 файла:</p>
<p><strong>2_CT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "2_CT",
    "description": "Chart visualization template",
    "icon": "bar-chart-horizontal",
    "type": "visualization",
    "version": "1.0.0",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>2_CT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( ["qlik", "text!./2_CT.ng.html", "css!./2_CT.css"],
    function ( qlik, template ) {
        "use strict";
        return {
            template: template,
            initialProperties: {
                qHyperCubeDef: {
                    qDimensions: [],
                    qMeasures: [],
                    qInitialDataFetch: [{
                        qWidth: 2,
                        qHeight: 50
                    }]
                }
            },
            definition: {
                type: "items",
                component: "accordion",
                items: {
                    dimensions: {
                        uses: "dimensions",
                        min: 1,
                        max: 1
                    },
                    measures: {
                        uses: "measures",
                        min: 1,
                        max: 1
                    },
                    sorting: {
                        uses: "sorting"
                    }
                }
            },
            support: {
                snapshot: true,
                export: true,
                exportData: true
            },
            paint: function () {
                //needed for export
                this.$scope.selections = [];
                return qlik.Promise.resolve();
            },
            controller: ["$scope", "$element", function ( $scope ) {
                $scope.getPercent = function ( val ) {
                    return Math.round( (val * 100 / $scope.layout.qHyperCube.qMeasureInfo[0].qMax) * 100 ) / 100;
                };

                $scope.selections = [];

                $scope.sel = function ( $event ) {
                    if ( $event.currentTarget.hasAttribute( "data-row" ) ) {
                        var row = parseInt( $event.currentTarget.getAttribute( "data-row" ), 10 ), dim = 0,
                            cell = $scope.$parent.layout.qHyperCube.qDataPages[0].qMatrix[row][0];
                        if ( cell.qIsNull !== true ) {
                            cell.qState = (cell.qState === "S" ? "O" : "S");
                            if ( $scope.selections.indexOf( cell.qElemNumber ) === -1 ) {
                                $scope.selections.push( cell.qElemNumber );
                            } else {
                                $scope.selections.splice( $scope.selections.indexOf( cell.qElemNumber ), 1 );
                            }
                            $scope.selectValues( dim, [cell.qElemNumber], true );
                        }
                    }
                };
            }]
        };

    } );</pre>
<p><strong>2_CT.css</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="css">.qv-object-2_CT .css_bars_row {
    transition: all 0.3s ease;
    float: left;
    width: 98%;
    overflow: hidden;
    border: 1px solid #ccc;
    background-color: #f0f0f0;
    margin-bottom: 2px;
    border-radius: 0 10px 10px 0;
    -moz-border-radius: 0 10px 10px 0;
    cursor: pointer;
}

.qv-object-2_CT .css_bars_bar {
    float: left;
    clear: left;
    height: 30px;
    background-color: #5f5f5f;
}

.qv-object-2_CT .css_bars_bar span {
    font-weight: bold;
    float: left;
    margin-left: 5px;
    margin-right: 5px;
    margin-top: 7px;
    color: #f0f0f0;
    overflow: hidden;
    text-overflow: ellipsis;
    width: 90%;
    white-space: nowrap;
}

.qv-object-2_CT .css_bars_per {
    position: relative;
}

.qv-object-2_CT .css_bars_per span {
    font-weight: bold;
    float: left;
    margin-right: 5px;
    margin-top: 5px;
    margin-left: 5px;
}

.qv-object-2_CT .css_bars_per span.over {
    position: absolute;
    right: 15px;
    color: #f0f0f0;
}

.qv-object-2_CT .css_bars_row:hover, .qv-object-2_CT .css_bars_row.selected {
    border: 1px solid #000;
}</pre>
<p><strong>2_CT.ng.html</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;div qv-extension style="height: 100%; position: relative; overflow: auto;"&gt;
    &lt;div class="css_bars_row" ng-repeat="item in layout.qHyperCube.qDataPages[0].qMatrix" title="{{item[0].qText}}" data-row="{{ $index }}"
         ng-click="sel($event)" data-value="{{ item[0].qElemNumber }}" ng-class="{selected: (item[0].qState) === 'S' || selections.indexOf(item[0].qElemNumber) !== -1 }"&gt;
        &lt;div class="css_bars_bar" ng-style="{'width':getPercent(item[1].qNum)+'%'}"&gt;&lt;span&gt;{{item[0].qText}}&lt;/span&gt;&lt;/div&gt;
        &lt;div class="css_bars_per"&gt;
            &lt;span ng-class="{over: (getPercent(item[1].qNum)&gt;95)}"&gt;{{getPercent(item[1].qNum)}} %&lt;/span&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<h3>Listbox template</h3>
<p>Назовем наш Extension &#8220;3_LBT&#8221;. При инициализации создадутся 3 файла:</p>
<p><strong>3_LBT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( ["qlik", "jquery", "text!./style.css"], function ( qlik, $, cssContent ) {
    'use strict';
    $( "&lt;style&gt;" ).html( cssContent ).appendTo( "head" );
    return {
        initialProperties: {
            qListObjectDef: {
                qShowAlternatives: true,
                qFrequencyMode: "V",
                qInitialDataFetch: [{
                    qWidth: 2,
                    qHeight: 50
                }]
            }
        },
        definition: {
            type: "items",
            component: "accordion",
            items: {
                dimension: {
                    type: "items",
                    label: "Dimensions",
                    ref: "qListObjectDef",
                    min: 1,
                    max: 1,
                    items: {
                        label: {
                            type: "string",
                            ref: "qListObjectDef.qDef.qFieldLabels.0",
                            label: "Label",
                            show: true
                        },
                        libraryId: {
                            type: "string",
                            component: "library-item",
                            libraryItemType: "dimension",
                            ref: "qListObjectDef.qLibraryId",
                            label: "Dimension",
                            show: function ( data ) {
                                return data.qListObjectDef &amp;&amp; data.qListObjectDef.qLibraryId;
                            }
                        },
                        field: {
                            type: "string",
                            expression: "always",
                            expressionType: "dimension",
                            ref: "qListObjectDef.qDef.qFieldDefs.0",
                            label: "Field",
                            defaultValue: "=ValueList('A','B','C')",
                            show: function ( data ) {
                                return data.qListObjectDef &amp;&amp; !data.qListObjectDef.qLibraryId;
                            }
                        },
                        frequency: {
                            type: "string",
                            component: "dropdown",
                            label: "Frequency mode",
                            ref: "qListObjectDef.qFrequencyMode",
                            options: [{
                                value: "N",
                                label: "No frequency"
                            }, {
                                value: "V",
                                label: "Absolute value"
                            }, {
                                value: "P",
                                label: "Percent"
                            }, {
                                value: "R",
                                label: "Relative"
                            }],
                            defaultValue: "V"
                        }
                    }
                },
                settings: {
                    uses: "settings"
                }
            }
        },
        support : {
            snapshot: true,
            export: true,
            exportData : false
        },
        paint: function ( $element,layout ) {
            var self = this, html = "&lt;ul&gt;";
            layout.qListObject.qDataPages[0].qMatrix.forEach( function ( row ) {
                html += '&lt;li class="data state' + row[0].qState + '" data-value="' + row[0].qElemNumber + '"&gt;' + row[0].qText;
                if ( row[0].qFrequency ) {
                    html += '&lt;span&gt;' + row[0].qFrequency + '&lt;/span&gt;';
                }
                html += '&lt;/li&gt;';
            } );
            html += "&lt;/ul&gt;";
            $element.html( html );
            if ( this.selectionsEnabled ) {
                $element.find( 'li' ).on( 'click', function () {
                    if ( this.hasAttribute( "data-value" ) ) {
                        var value = parseInt( this.getAttribute( "data-value" ), 10 ), dim = 0;
                        self.selectValues( dim, [value], true );
                        this.classList.toggle("selected");
                    }
                } );
            }
            return qlik.Promise.resolve();
        }
    };
} );
</pre>
<p><strong>3_LBT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "3_LBT",
    "description": "Listbox visualization template",
    "icon": "list",
    "type": "visualization",
    "version": "1.0.0",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>style.css</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="css">.qv-object-3_LBT div.qv-object-content-container {
    overflow: auto;
}
.qv-object-3_LBT ul {
    list-style: none;
}
.qv-object-3_LBT li.data {
    padding: 4px;
    border-bottom: 1px solid #ddd;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* frequency */
.qv-object-3_LBT li.data span
{
    padding-left: 10px;
    font-style: italic;
    float:right;
}
/* colors when NOT in selection mode */

.qv-object-3_LBT li.stateS, .qv-object-3_LBT li.stateL {
    background-image: linear-gradient(top, #52cc52, #4dc04d);
    background-image: -o-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -moz-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -webkit-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -ms-linear-gradient(top, #52cc52, #4dc04d);
    color: #fff;
}

.qv-object-3_LBT li.stateX, .qv-object-3_LBT li.stateXL, .qv-object-3_LBT li.stateXS {
    background-color: #A9A9A9;
    color: #fff;
}

.qv-object-3_LBT li.stateA {
    background-image: none;
    background-color: #ddd;
    color: #000;
}
/* colors when in selection mode */
.qv-object-3_LBT.qv-selections-active li {
    background-image: none;
    background-color: #ddd;
    color: #000;
}

.qv-object-3_LBT.qv-selections-active li.selected {
    background-image: linear-gradient(top, #52cc52, #4dc04d);
    background-image: -o-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -moz-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -webkit-linear-gradient(top, #52cc52, #4dc04d);
    background-image: -ms-linear-gradient(top, #52cc52, #4dc04d);
    color: #fff;
}</pre>
<h3>Angular Basic Visualization template</h3>
<p>Назовем наш Extension <strong>&#8220;4_ABVT&#8221;</strong>. При инициализации создадутся 3 файла:</p>
<p><strong>4_ABVT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "4_ABVT",
    "description": "Basic empty visualization template based on angular.js",
    "type": "visualization",
    "version": "1.0.0",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>4_ABVT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( ["qlik", "text!./template.html"],
    function ( qlik, template ) {

        return {
            template: template,
            support: {
                snapshot: true,
                export: true,
                exportData: false
            },
            paint: function () {
                return qlik.Promise.resolve();
            },
            controller: ['$scope', function ( $scope ) {
                //add your rendering code here
                $scope.html = "Hello World";
            }]
        };

    } );</pre>
<p><strong>template.html</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;div qv-extension style="height: 100%; position: relative; overflow: auto;" class="ng-scope"&gt;
    {{ html }} 
&lt;/div&gt;</pre>
<h3>Angular Table template</h3>
<p>Назовем наш Extension <strong>&#8220;5_ATT&#8221;</strong>. При инициализации создадутся 4 файла:</p>
<p><strong>5_ATT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( ["qlik","jquery", "text!./style.css", "text!./template.html"], function (qlik, $, cssContent, template ) {'use strict';
    $("&lt;style&gt;").html(cssContent).appendTo("head");
    return {
       template: template,
       initialProperties : {
            qHyperCubeDef : {
                qDimensions : [],
                qMeasures : [],
                qInitialDataFetch : [{
                    qWidth : 10,
                    qHeight : 50
                }]
            }
        },
        definition : {
            type : "items",
            component : "accordion",
            items : {
                dimensions : {
                    uses : "dimensions",
                    min : 1
                },
                measures : {
                    uses : "measures",
                    min : 0
                },
                sorting : {
                    uses : "sorting"
                },
                settings : {
                    uses : "settings",
                    items : {
                        initFetchRows : {
                            ref : "qHyperCubeDef.qInitialDataFetch.0.qHeight",
                            label : "Initial fetch rows",
                            type : "number",
                            defaultValue : 50
                        }
                    }
                }
            }
        },
        support : {
            snapshot: true,
            export: true,
            exportData : true
        },
        paint: function ( ) {
            //setup scope.table
            if ( !this.$scope.table ) {
                this.$scope.table = qlik.table( this );
            }
            return qlik.Promise.resolve();
        },
        controller: ['$scope', function (/*$scope*/) {
        }]
    };

} );
</pre>
<p><strong>5_ATT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "5_ATT",
    "description": "Table visualization template based on angular.js",
    "icon": "table",
    "type": "visualization",
    "version": "1.0.0",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>style.css</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="css">.qv-object-5_ATT div.qv-object-content-container {
    overflow: auto;
}
.qv-object-5_ATT td,
.qv-object-5_ATT th {
    border-top: 0px solid #fff;
    border-bottom: 1px solid #ddd;
    border-right: 1px solid #ddd;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    vertical-align: middle;
    cursor: default;
    font-size: 12px;
}
.qv-object-5_ATT td.numeric {
    text-align: right;
}
.qv-object-5_ATT button {
    width: 100%;
}</pre>
<p><strong>template.html</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;div qv-extension style="height: 100%; position: relative; overflow: auto;"&gt;
    &lt;table&gt;
        &lt;thead&gt;
        &lt;tr&gt;
            &lt;th ng-repeat="head in table.headers track by $index" ng-click="head.orderBy()"&gt;{{head.qFallbackTitle}}&lt;/th&gt;
        &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
        &lt;tr ng-repeat="row in table.rows track by $index"&gt;
            &lt;td ng-repeat="cell in row.cells track by $index" class="selectable" ng-class="{'selected':cell.selected,'numeric':cell.qNum}" ng-click="cell.select($event)"&gt;{{cell.qText}}&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;button ng-if="table.rowCount&gt;table.rows.length" ng-click="table.getMoreData()" class="lui-button more"&gt;More...&lt;/button&gt;
&lt;/div&gt;
</pre>
<h3>Table template</h3>
<p>Назовем наш Extension <strong>&#8220;6_TT&#8221;</strong>. При инициализации создадутся 3 файла:</p>
<p><strong>6_TT.js</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">/*globals define*/
define( ["qlik", "jquery", "text!./style.css"], function ( qlik, $, cssContent ) {
    'use strict';
    $( "&lt;style&gt;" ).html( cssContent ).appendTo( "head" );
    function createRows ( rows, dimensionInfo ) {
        var html = "";
        rows.forEach( function ( row ) {
            html += '&lt;tr&gt;';
            row.forEach( function ( cell, key ) {
                if ( cell.qIsOtherCell ) {
                    cell.qText = dimensionInfo[key].othersLabel;
                }
                html += "&lt;td ";
                if ( !isNaN( cell.qNum ) ) {
                    html += "class='numeric'";
                }
                html += '&gt;' + cell.qText + '&lt;/td&gt;';
            } );
            html += '&lt;/tr&gt;';
        } );
        return html;
    }

    return {
        initialProperties: {
            qHyperCubeDef: {
                qDimensions: [],
                qMeasures: [],
                qInitialDataFetch: [{
                    qWidth: 10,
                    qHeight: 50
                }]
            }
        },
        definition: {
            type: "items",
            component: "accordion",
            items: {
                dimensions: {
                    uses: "dimensions",
                    min: 1
                },
                measures: {
                    uses: "measures",
                    min: 0
                },
                sorting: {
                    uses: "sorting"
                },
                settings: {
                    uses: "settings"
                }
            }
        },
        snapshot: {
            canTakeSnapshot: true
        },
        paint: function ( $element, layout ) {
            var html = "&lt;table&gt;&lt;thead&gt;&lt;tr&gt;", self = this,
                morebutton = false,
                hypercube = layout.qHyperCube,
                rowcount = hypercube.qDataPages[0].qMatrix.length,
                colcount = hypercube.qDimensionInfo.length + hypercube.qMeasureInfo.length;
            //render titles
            hypercube.qDimensionInfo.forEach( function ( cell ) {
                html += '&lt;th&gt;' + cell.qFallbackTitle + '&lt;/th&gt;';
            } );
            hypercube.qMeasureInfo.forEach( function ( cell ) {
                html += '&lt;th&gt;' + cell.qFallbackTitle + '&lt;/th&gt;';
            } );
            html += "&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;";
            //render data
            html += createRows( hypercube.qDataPages[0].qMatrix, hypercube.qDimensionInfo );
            html += "&lt;/tbody&gt;&lt;/table&gt;";
            //add 'more...' button
            if ( hypercube.qSize.qcy &gt; rowcount ) {
                html += "&lt;button class='more'&gt;More...&lt;/button&gt;";
                morebutton = true;
            }
            $element.html( html );
            if ( morebutton ) {
                $element.find( ".more" ).on( "click", function () {
                    var requestPage = [{
                        qTop: rowcount,
                        qLeft: 0,
                        qWidth: colcount,
                        qHeight: Math.min( 50, hypercube.qSize.qcy - rowcount )
                    }];
                    self.backendApi.getData( requestPage ).then( function ( dataPages ) {
                        rowcount += dataPages[0].qMatrix.length;
                        if ( rowcount &gt;= hypercube.qSize.qcy ) {
                            $element.find( ".more" ).hide();
                        }
                        var html = createRows( dataPages[0].qMatrix, hypercube.qDimensionInfo );
                        $element.find( "tbody" ).append( html );
                    } );
                } );
            }
            return qlik.Promise.resolve();
        }
    };
} );
</pre>
<p><strong>6_TT.qext</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="json">{
    "name": "6_TT",
    "description": "Table visualization template",
    "icon": "table",
    "type": "visualization",
    "version": "1.0.0",
    "author": "",
    "homepage": "",
    "keywords": "qlik-sense, visualization",
    "license": "",
    "repository": "",
    "dependencies": {
        "qlik-sense": "&gt;=3.0.x"
    }
}</pre>
<p><strong>style.css</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="css">.qv-object-6_TT div.qv-object-content-container {
    overflow: auto;
}
.qv-object-6_TT td,
.qv-object-6_TT th {
    border-top: 0px solid #fff;
    border-bottom: 1px solid #ddd;
    border-right: 1px solid #ddd;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    vertical-align: middle;
    cursor: default;
    font-size: 12px;
}
.qv-object-6_TT td.numeric {
    text-align: right;
}
.qv-object-6_TT button {
    width: 100%;
}</pre>
<h2>Структура расширения</h2>
<p>Как мы видим из примеров стандартных шаблонов экстеншенов для создания расширения необходимо минимум 2 файла &#8211; js и qext. Для более богатой функциональности добавляются css и html.</p>
<p><strong>Опишем зачем нужны файлы:</strong></p>
<ul>
<li><span style="color: #ff6600;"><em><strong>&lt;name_extension&gt;</strong></em></span>.<strong>js</strong> &#8211; это код Javascript &#8211; фактически это ядро вашего Extension. Здесь происходит отрисовка визуализации (например, в цикле заполняется html код с тегами при обходе гиперкуба qlik sense), настраивается логика работы с выборкой и другие действия.</li>
<li><span style="color: #ff6600;"><em><strong>&lt;name_extension&gt;</strong></em></span>.<strong>qext</strong> &#8211; <span><span style="color: #339966;"><strong>extension metadata file (QEXT)</strong></span> &#8211; файл JSON, который используется <span class="CommonComponentsQlik Sense">Qlik Sense</span> для идентификации расширения визуализации. В этом файле указывается название расширения, тип расширения, версия, автор, ключевые слова. И другие атрибуты, которые будут расмотрены в дальнейших разделах.</span></li>
<li><span style="color: #ff6600;"><em><strong>&lt;name_extension&gt;</strong></em></span>.<strong>css</strong> &#8211; в этом файле прописываются стили для кастомной визуализации (т.е. вашего экстеншена).</li>
<li><span style="color: #ff6600;"><em><strong>&lt;name_extension&gt;</strong></em></span>.<strong>html</strong> &#8211; шаблон html кода, который будет использоваться в js коде и заполняться внутри js кода (например в цикле). Этот прием используется, например, в Angular Framework.</li>
<li><strong>wbfolder.wbl<sup>*</sup></strong> (<span>не является обязательным</span>) &#8211; <span>Файл загрузки Workbench &#8211; используется редактором Extension &amp; Mashup и содержит список файлов, которые должны быть загружены в редактор dev-hub (без него вы не сможете открыть или продублировать расширение в dev-hub).</span><br />
<span>Когда вы сохраняете проект расширения или Mashup из редактора, WBL-файл автоматически создается и включается в проект. Если вы сделаете копию расширения или мэшапа, то будут скопированы только файлы, перечисленные в wbfolder.wbl.<br />
Добавляя дополнительные имена файлов &#8211; разделенные точкой с запятой и переносом строки &#8211; в wbfolder.wbl, вы также можете разрешить загрузку этих дополнительных файлов. При отсутствии файла может возникнуть ошибка <span style="color: #800080;"><em><strong>Incomplete visualization. The visualization is incomplete and cannot be opened or duplicated (wbfolder.wbl file missing).</strong></em></span></span></li>
</ul>
<p><strong>Рассмотрим процесс отрисовки экстеншена:</strong></p>
<p><span>Когда пользователь открывает лист, </span><span class="PrimaryGenericName"><span>Qlik Sense</span></span><span> извлекает визуализации на этом листе, а затем выполняет стандартный рабочий процесс для каждой визуализации.</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/Qlik_Sense_Extension_API_concepts_Overview.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/Qlik_Sense_Extension_API_concepts_Overview.png" alt="" width="536" height="698" class="aligncenter size-full wp-image-2504" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/Qlik_Sense_Extension_API_concepts_Overview.png 536w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/Qlik_Sense_Extension_API_concepts_Overview-230x300.png 230w" sizes="(max-width: 536px) 100vw, 536px" /></a></p>
<p>Пример <strong>Hello World</strong> можно посмотреть на сайте <strong><a href="http://qliksite.io/tutorials/qliksense-visualization-extensions/part-01/03-Lets-Get-Started--Hello-World-Example/" target="_blank" rel="noopener">http://qliksite.io/tutorials/qliksense-visualization-extensions/part-01/03-Lets-Get-Started&#8211;Hello-World-Example/</a></strong></p>
<h2>Схема работы JS кода в QS Extension</h2>
<p><code>define</code> <span>&#8211; это концепция, введенная </span><strong><a href="https://requirejs.org/" target="_blank" rel="noopener">RequireJS</a></strong><span><strong> </strong>для определения зависимостей в ваших файлах JavaScript. Идея состоит в том, чтобы загрузить внешние зависимости до того, как будет выполнен ваш основной скрипт. </span></p>
<p><span><strong>Зависимости</strong> – внешние модули (скрипты/библиотеки), которые необходимы для работы нашего расширения.</span></p>
<p><code>paint</code><span> &#8211; основной метод визуализации визуализации, который будет вызываться каждый раз, когда визуализация должна быть отрисована, либо из-за новых данных с сервера, либо из-за изменения размера.</span></p>
<p><span>Метод paint получает два параметра </span><code>$element</code><span>и </span><code>layout</code><span>.</span></p>
<table>
<thead>
<tr>
<th><strong>Параметр</strong></th>
<th><strong>Описание</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>$element</code></td>
<td><span>Оболочка jQuery, содержащая родительский элемент HTML, в котором должна отображаться визуализация.</span></td>
</tr>
<tr>
<td><code>layout</code></td>
<td><span>Данные и свойства для визуализации.</span></td>
</tr>
</tbody>
</table>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qliksense_requirejs_define.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qliksense_requirejs_define.png" alt="" width="674" height="882" class="aligncenter size-full wp-image-2507" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qliksense_requirejs_define.png 674w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/01/qliksense_requirejs_define-229x300.png 229w" sizes="(max-width: 674px) 100vw, 674px" /></a></p>
<p>todo</p>
<h1>Видео &#8220;How to build Qlik Sense Visualization Extensions &#8211; Introduction&#8221;</h1>
<p><iframe title="How to build Qlik® Sense Visualization Extensions - 1. Introduction" width="750" height="422" src="https://www.youtube.com/embed/n7RICsLGiCE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<h1>Методы Qlik Sense Extension API</h1>
<h2>beforeDestroy</h2>
<p><span>Выполняется до того, как объект будет уничтожен путем его удаления, переключения листа, открытия инструмента выделения или любых других средств удаления расширения. </span><span>Используйте этот метод для того, чтобы удалить привязки и предотвратить утечку памяти.</span></p>
<blockquote><p><span><strong>Утечка памяти</strong> — это, в широком смысле, фрагмент памяти, выделенной приложению, который больше не нужен этому приложению, но не может быть возвращён операционной системе для дальнейшего использования. Другими словами это — блок памяти, который захвачен приложением без намерения пользоваться этой памятью в будущем.</span></p>
<p><strong>Источник:</strong> <a href="https://habr.com/ru/company/ruvds/blog/495898/" target="_blank" rel="noopener">Практическое руководство по борьбе с утечками памяти в Node.js</a></p></blockquote>
<h2>mounted</h2>
<p><span>Выполняется один раз при инициализации объекта.</span></p>
<p><code><span>mounted($element)</span></code></p>
<h2>paint</h2>
<p><span>Отрисовывает (или render) визуализацию расширения. </span><span>Вызовите этот метод, когда необходимо отрисовать visualization extension либо из-за новых данных с сервера, либо из-за изменения размера расширения визуализации.</span></p>
<h3>Параметры метода paint</h3>
<h4>$element</h4>
<p><span>Оболочка jQuery, содержащая HTML-элемент, в котором должна отображаться визуализация.</span></p>
<h4>layout</h4>
<p><span>Данные и свойства для визуализации.</span></p>
<h4>layout.qHyperCube.qDimensionInfo</h4>
<p><span>Массив с данными об используемых dimensions. Включает <code>qFallbackTitle</code></span><span>, заголовок и </span><code><span class="syntax"><span>qCardinal</span></span></code><span> , количество различных значений.</span></p>
<h4>layout.qHyperCube.qMeasureInfo</h4>
<p><span>Массив с данными об используемых мерах. Включает </span><code><span class="syntax"><span>qFallbackTitle</span></span></code><span>, заголовок (title), </span><code><span class="syntax"><span>qCardinal</span></span></code><span>, количество различных значений, </span><code><span class="syntax"><span>qMin</span></span></code><span> и </span><code><span class="syntax"><span>qMax</span></span></code><span> для минимального и максимального значений.</span></p>
<h4>layout.qHyperCube.qDataPages[0].qMatrix</h4>
<p><span>Массив с данными из </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span> . Каждому объекту соответствует строка в результате. Значения измерения (dimension) и меры (measure) являются объектами JavaScript в этом массиве.</span></p>
<h4>layout.qHyperCube.qDataPages[0].qMatrix[0..#dimensions – 1]</h4>
<p><span>Значения Dimension для строки результата. Каждый объект содержит текст ( </span><code><span class="syntax"><span>qText</span></span></code><span>), используемый для рендеринга, и значение ( </span><code><span class="syntax"><span>qElemNumber</span></span></code><span> ), используемое для selections, и состояние значения ( </span><code><span class="syntax"><span>qState</span></span></code><span> ).</span></p>
<h4>layout.qHyperCube.qDataPages[0].qMatrix[#dimensions..]</h4>
<p><span>Массив со значениями measure для строки результата. Каждый объект содержит данные, фактическое значение ( </span><code><span class="syntax"><span>qNum</span></span></code><span> ) и текст ( </span><code><span class="syntax"><span>qText</span></span></code><span> ), форматированное значение.</span></p>
<h4>layout.qHyperCube.qSize</h4>
<p><span>Общее количество строк (</span><code><span class="syntax"><span>qcy</span></span></code><span>) и столбцов (</span><code><span class="syntax"><span>qcx</span></span></code><span>) в результирующем наборе.</span></p>
<h4>layout.qInfo.qId</h4>
<p><span><code>qId</code> &#8211; Уникальный идентификатор объекта. </span><span>При необходимости полезно для создания уникального HTML-идентификатора.</span></p>
<h4>layout.qSelectionInfo</h4>
<p><span>Если пользователь находится в режиме выбора, это будет объект с двумя флагами: </span><code><span class="syntax"><span>qInSelections</span></span></code><span> и </span><code><span class="syntax"><span>qMadeSelections</span></span></code><span>.</span></p>
<h2>updateData</h2>
<p><span>Выполняется каждый раз при изменении layout или данных, например при осуществлении выборок или изменении свойств. </span><span>Получает новый layout и возвращает promise.</span></p>
<p><code><span>updateData(layout)</span></code></p>
<p>&nbsp;</p>
<h1>Properties Qlik Sense Extension API</h1>
<h2>initialProperties</h2>
<p><code><span>initialProperties()</span></code></p>
<p><span>Задает свойства, которые объект должен иметь при создании. Определите либо как гиперкуб ( </span><code><span class="syntax"><span>qHyperCubeDef</span></span></code><span> ), либо как объект списка ( </span><code><span class="syntax"><span>qListObjectDef</span></span></code><span> ).</span></p>
<p><span>Настройте все свойства и назначьте значения по умолчанию для <strong>custom properties</strong>.</span></p>
<p><span>Максимальное количество ячеек ( </span><code><span class="statement"><span>qWidth</span></span></code><span> * </span><code><span class="statement"><span>qHeight</span></span></code><span> ), разрешенное при исходной <span class="statement">выборке</span> данных, составляет 10 000. Получите дополнительные данные по частям с помощью метода </span><code><span class="syntax"><span>getData</span></span></code><span> в <strong>Backend API</strong>.</span></p>
<p><strong><span class="autonumber">Пример:</span> использование гиперкуба</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">initialProperties : {
    qHyperCubeDef : {
        qDimensions : [],
        qMeasures : [],
        qInitialDataFetch : [{
            qWidth : 2,
            qHeight : 50
        }]
    }
}</pre>
<p><strong><span class="autonumber">Пример</span>, в котором используется объект списка, а также определяются некоторые custom properties</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">initialProperties : {
    qListObjectDef : {
        qShowAlternatives : true,
        qFrequencyMode : "V",
        qInitialDataFetch : [{
            qWidth : 2,
            qHeight : 50
        }]
    },
    fixed : true,
    width : 25,
    percent : true,
    selectionMode : "CONFIRM"
}</pre>
<h3>Ограничение 10000 ячеек</h3>
<p>Ходят упорные слухи, что при работе с HyperCube с использованием клиентских API (в расширениях визуализации или мэшапах) можно загрузить только 10 000 ячеек данных.</p>
<p><span style="color: #ff9900;"><strong>Этот слух не соответствует действительности !!!</strong></span></p>
<p>Вместо этого верно, что вы можете получить только 10 000 записей на страницу данных из Engine, но вы, безусловно, можете запросить получение дополнительных страниц данных.<br />
Таким образом, разработчик полностью решает, сколько точек данных из источника данных используется в пользовательском интерфейсе.</p>
<h2>snapshot</h2>
<p><span>Включает или отключает возможность делать снимки расширения визуализации для использования в Data Storytelling.</span></p>
<p><code><span>snapshot(enable)</span></code></p>
<h2>export</h2>
<p><span>Включает или отключает возможность экспорта расширения визуализации как изображения или как <strong>PDF-файл.</strong> Это также позволяет включить расширение визуализации в <strong>экспорт из Storytelling</strong> (PowerPoint или PDF).</span></p>
<p><span>Если задано значение </span><code><span class="syntax"><span>true</span></span></code><span> , включены параметры контекстного меню <strong>«</strong></span><strong><span class="ui_item">Экспорт как изображение»</span></strong><span> и <strong>«</strong></span><strong><span class="ui_item">Экспорт в PDF»</span></strong><span> для расширения визуализации. Это также позволяет расширениям визуализации быть частью историй, экспортируемых в PowerPoint или PDF, в параметрах контекстного меню «</span><span class="ui_item"><span>Экспорт истории в PowerPoint»</span></span><span> и «</span><span class="ui_item"><span>Экспорт истории в PDF»</span></span><span>.</span></p>
<h2>exportData</h2>
<p><span>Включает или отключает возможность экспорта данных из расширения визуализации и сохранения их в файле XLSX. Если задано значение </span><code><span class="syntax"><span>true</span></span></code><span>, параметр контекстного меню <strong>«</strong></span><strong><span class="ui_item">Экспорт данных»</span></strong><span> включен для расширения визуализации.</span></p>
<h2>Пример</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var ext = {
    support: {
        snapshot: true,
        export: true,
        exportData: true
    }
};</pre>
<h1>Property definitions</h1>
<h2>Array</h2>
<p>todo</p>
<h2>Integer</h2>
<p>todo</p>
<h2>Number</h2>
<p>todo</p>
<h2>String</h2>
<p>todo</p>
<h2>Text</h2>
<p>todo</p>
<h2>Button</h2>
<p>todo</p>
<h2>Button group</h2>
<p>todo</p>
<h2>Check box</h2>
<p>todo</p>
<h2>Color-picker</h2>
<p>todo</p>
<h2>Drop down list</h2>
<p>todo</p>
<h2>Link</h2>
<p>todo</p>
<h2>Media</h2>
<p>todo</p>
<h2>Radio button</h2>
<p>todo</p>
<h2>Slider</h2>
<p>todo</p>
<h2>Range-slider</h2>
<p>todo</p>
<h2>Switch</h2>
<p>todo</p>
<h2>Textarea</h2>
<p>todo</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/">Обзор Extension API и описание методов расширений</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/overview-qlik-extension-api-and-methods/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Обзор функций Javascript в редакторе Qlik Sense Extensions</title>
		<link>https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/</link>
					<comments>https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Sat, 09 Jan 2021 20:22:39 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[javascript qlik sense]]></category>
		<category><![CDATA[qlik sense api]]></category>
		<category><![CDATA[Qlik Sense Extension]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2488</guid>

					<description><![CDATA[<p>== A == arguments &#8211; alert &#8211; показывает сообщение и ждёт, пока пользователь нажмёт кнопку «ОК» atob &#8211; Функция декодирует строку данных , которые были закодированы с помощью Base64 кодирования. var decodedData = scope.atob(encodedData); angular &#8211; addEventListener &#8211; способ назначения обработчиков на события с привязкой к элементу. Синтаксис: element.addEventListener(event, handler[, options]); event &#8211; Имя<a class="moretag" href="https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/">Обзор функций Javascript в редакторе Qlik Sense Extensions</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>== A ==</h2>
<ul>
<li><strong>arguments</strong> &#8211;</li>
<li><strong>alert </strong>&#8211; <span>показывает сообщение и ждёт, пока пользователь нажмёт кнопку «ОК»</span></li>
<li><strong>atob </strong>&#8211; <span>Функция декодирует строку данных , которые были закодированы с помощью </span><a href="https://developer.mozilla.org/en-US/docs/Glossary/Base64"><span>Base64</span></a><span> кодирования.</span>
<ul>
<li>
<pre class="brush: js notranslate"><code><span class="token keyword">var</span> decodedData <span class="token operator">=</span> scope<span class="token punctuation">.</span><span class="token function">atob</span><span class="token punctuation">(</span>encodedData<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
</ul>
</li>
<li><strong>angular </strong>&#8211;</li>
<li><strong>addEventListener </strong>&#8211; способ назначения обработчиков на события с привязкой к элементу. Синтаксис:
<ul>
<li><code>element.addEventListener(event, handler[, options]);</code>
<ul>
<li><code>event</code> &#8211; Имя события, например<span> </span><code>"click"</code></li>
<li><code>handler</code> &#8211; Ссылка на функцию-обработчик</li>
<li><code>options</code> &#8211; Дополнительный объект со свойствами: <code>once</code><span>, <code>capture</code>, <code>passive</code>.</span></li>
</ul>
</li>
<li><span>Метод </span><code>addEventListener</code><span> позволяет добавлять несколько обработчиков на одно событие одного элемента</span>
<ul>
<li>
<pre class="EnlighterJSRAW" data-enlighter-language="js">function handler1() {
  alert('Спасибо!');
};

function handler2() {
  alert('Спасибо ещё раз!');
}

elem.onclick = () =&gt; alert("Привет");
elem.addEventListener("click", handler1); // Спасибо!
elem.addEventListener("click", handler2); // Спасибо ещё раз!</pre>
<p><strong></strong></li>
</ul>
</li>
</ul>
</li>
<li><strong>app </strong>&#8211;</li>
</ul>
<h2>== B ==</h2>
<ul>
<li><strong>blur </strong>&#8211;</li>
<li><strong>btoa </strong>&#8211; <span>Метод создает </span><a href="https://developer.mozilla.org/en-US/docs/Glossary/Base64"><span>Base64</span></a><span> закодированную ASCII строку из </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary"><span>двоичной строки</span></a> / Binary<span> (то есть </span><code>String</code> <span>объект , в котором каждый символ в строке рассматриваются как байты двоичных данных). Вы можете использовать этот метод для кодирования данных, которые в противном случае могут вызвать проблемы со связью, передать их, а затем использовать метод <code>atob()</code> для повторного декодирования данных.</span>
<ul>
<li>
<pre class="brush: js notranslate"><code><span class="token keyword">var</span> encodedData <span class="token operator">=</span> scope<span class="token punctuation">.</span><span class="token function">btoa</span><span class="token punctuation">(</span>stringToEncode<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
</ul>
</li>
<li><strong>break </strong>&#8211;</li>
<li><strong>backendApi </strong>&#8211;</li>
</ul>
<h2>== C ==</h2>
<ul>
<li><strong>customElements </strong>&#8211;</li>
<li><strong>closed </strong>&#8211;</li>
<li><strong>clientInformation </strong>&#8211;</li>
<li><strong>crypto </strong>&#8211;</li>
<li><strong>cancelAnimationFrame </strong>&#8211;</li>
<li><strong>cancelIdleCallback </strong>&#8211;</li>
<li><strong>captureEvents </strong>&#8211;</li>
<li><strong>clearInterval </strong>&#8211; <span>отменяет синхронизированное, повторяющееся действие, которое было ранее установлено вызовом </span><code>setInterval()</code><span>.</span></li>
<li><strong>clearTimeout </strong>&#8211; <span>отменяет тайм &#8211; аут ранее установленного вызовом метода </span><code>setTimeout()</code><span>.</span></li>
<li><strong>close </strong>&#8211;</li>
<li><strong>confirm </strong>&#8211; <span>отображает диалоговое окно, которое содержит две кнопки (OK и Cancel), а так же опциональное (необязательное) текстовое сообщение.</span>
<ul>
<li><code>result = confirm(message);</code>
<ul>
<li><code>message</code><span> </span>опциональная (необязательная) строка, которая будет отображена в диалоговом окне.</li>
<li><code>result</code><span> </span>булево значение, указывающее на нажатую кнопку OK или Cancel (<code>true</code> означает OK).</li>
</ul>
</li>
</ul>
</li>
<li><strong>createImageBitmap</strong> &#8211; <span>Метод создает bitmap из источника, при необходимости можно использовать только часть источника. Метод существует в глобальной области как в окнах, так и в рабочих процессах. Он принимает множество различных источников изображений и возвращает </span><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise" data-flaw-src="{{domxref(&quot;Promise&quot;)}}"><code>Promise</code></a>, <span>которое <strong>resolve</strong> в </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap"><code>ImageBitmap</code></a><span>.</span></li>
<li><strong>chrome </strong>&#8211;</li>
<li><strong>caches </strong>&#8211;</li>
<li><strong>case </strong>&#8211;</li>
<li><strong>catch </strong>&#8211;</li>
<li><strong>continue </strong>&#8211;</li>
</ul>
<h2>== D ==</h2>
<ul>
<li><strong>dimensionInfo </strong>&#8211;</li>
<li><strong>document </strong>&#8211;</li>
<li><strong>devicePixelRatio </strong>&#8211;</li>
<li><strong>defaultStatus </strong>&#8211;</li>
<li><strong>dragomanClosure </strong>&#8211;</li>
<li><strong>define </strong>&#8211;</li>
<li><strong>debounceTimer </strong>&#8211;</li>
<li><strong>dispatchEvent </strong>&#8211;</li>
<li><strong>debugger </strong>&#8211;</li>
<li><strong>default </strong>&#8211;</li>
<li><strong>delete </strong>&#8211;</li>
<li><strong>do </strong>&#8211;</li>
</ul>
<h2>== E ==</h2>
<ul>
<li><strong>external </strong>&#8211;</li>
<li><strong>engineModuleGlobal </strong>&#8211;</li>
<li><strong>else </strong>&#8211;</li>
</ul>
<h2>== F ==</h2>
<ul>
<li><strong>frames </strong>&#8211;</li>
<li><strong>frameElement </strong>&#8211;</li>
<li><strong>fetch </strong>&#8211; <span class="seoSummary"><span>Метод </span><code>WindowOrWorkerGlobalScope</code> <span>Mixin начинается процесс извлечения ресурса из сети, возвращая обещание , которое выполняется , как только отклик доступен. </span></span><span>Обещание преобразуется в </span><code>Response</code> <span>объект, представляющий ответ на ваш запрос. Обещание </span><em><span>не</span></em><span> отклоняется при ошибках HTTP &#8211; оно отклоняется только при ошибках сети. Вы должны использовать </span><code>then</code> <span>обработчики для проверки ошибок HTTP.</span></li>
<li><strong>find </strong>&#8211;</li>
<li><strong>focus </strong>&#8211;</li>
<li><strong>false </strong>&#8211;</li>
<li><strong>finally </strong>&#8211;</li>
<li><strong>for </strong>&#8211;</li>
<li><strong>function </strong>&#8211;</li>
</ul>
<h2>== G ==</h2>
<ul>
<li><strong>getComputedStyle </strong>&#8211;</li>
<li><strong>getSelection </strong>&#8211;</li>
</ul>
<h2>== H ==</h2>
<ul>
<li><strong>html </strong>&#8211;</li>
<li><strong>history </strong>&#8211;</li>
</ul>
<h2>== I ==</h2>
<ul>
<li><strong>innerWidth </strong>&#8211;</li>
<li><strong>innerHeight </strong>&#8211;</li>
<li><strong>isSecureContext </strong>&#8211;</li>
<li><strong>indexedDB </strong>&#8211;</li>
<li><strong>if </strong>&#8211;</li>
<li><strong>in </strong>&#8211;</li>
<li><strong>instanceof </strong>&#8211;</li>
</ul>
<h2>== L ==</h2>
<ul>
<li><strong>location </strong>&#8211;</li>
<li><strong>locationbar </strong>&#8211;</li>
<li><strong>length </strong>&#8211;</li>
<li><strong>localStorage </strong>&#8211;</li>
<li><strong>layout </strong>&#8211;</li>
</ul>
<h2>== M ==</h2>
<ul>
<li><strong>menubar </strong>&#8211;</li>
<li><strong>matchMedia </strong>&#8211;</li>
<li><strong>moveBy </strong>&#8211;</li>
<li><strong>moveTo </strong>&#8211;</li>
</ul>
<h2>== O ==</h2>
<ul>
<li><strong>opener </strong>&#8211; Свойство <b>opener</b> возвращает ссылку на окно, которое открыло текущее. Когда Вы открываете новое окно с помощью open() Вы можете воспользоваться этим свойством, чтобы взаимодействовать с родительским окном из нового окна.
<ul>
<li>
<pre class="EnlighterJSRAW" data-enlighter-language="js">//Создадим новое окно win 
win = window.open();
//Выведем в новое окно текст
win.document.write("Текст нового окна");
//Теперь выведем текст в родительское окно с помощью свойства opener
win.opener.document.write("Текст родительского окна");</pre>
<p>&nbsp;</li>
</ul>
</li>
<li><strong>origin </strong>&#8211;</li>
<li><strong>outerWidth </strong>&#8211;</li>
<li><strong>outerHeight </strong>&#8211;</li>
<li><strong>onsearch </strong>&#8211;</li>
<li><strong>onappinstalled </strong>&#8211;</li>
<li><strong>onbeforeinstallprompt </strong>&#8211;</li>
<li><strong>onabort </strong>&#8211;</li>
<li><strong>onblur </strong>&#8211;</li>
<li><strong>oncancel </strong>&#8211;</li>
<li><strong>oncanplay</strong> &#8211;</li>
<li><strong>oncanplaythrough </strong>&#8211;</li>
<li><strong>onchange </strong>&#8211;</li>
<li><strong>onclick </strong>&#8211;</li>
<li><strong>onclose </strong>&#8211;</li>
<li><strong>oncontextmenu </strong>&#8211;</li>
<li><strong>oncuechange </strong>&#8211;</li>
<li><strong>ondblclick </strong>&#8211;</li>
<li><strong>ondrag </strong>&#8211;</li>
<li><strong>ondragend </strong>&#8211;</li>
<li><strong>ondragenter </strong>&#8211;</li>
<li><strong>ondragleave </strong>&#8211;</li>
<li><strong>ondragover </strong>&#8211;</li>
<li><strong>ondragstart </strong>&#8211;</li>
<li><strong>ondrop</strong> &#8211;</li>
<li><strong>ondurationchange </strong>&#8211;</li>
<li><strong>onemptied </strong>&#8211;</li>
<li><strong>onended </strong>&#8211;</li>
<li><strong>onerror </strong>&#8211;</li>
<li><strong>onfocus </strong>&#8211;</li>
<li><strong>onformdata </strong>&#8211;</li>
<li><strong>oninput </strong>&#8211;</li>
<li><strong>oninvalid </strong>&#8211;</li>
<li><strong>onkeydown </strong>&#8211;</li>
<li><strong>onkeypress </strong>&#8211;</li>
<li><strong>onkeyup </strong>&#8211;</li>
<li><strong>onload </strong>&#8211;</li>
<li><strong>onloadeddata </strong>&#8211;</li>
<li><strong>onloadedmetadata </strong>&#8211;</li>
<li><strong>onloadstart </strong>&#8211;</li>
<li><strong>onmousedown </strong>&#8211;</li>
<li><strong>onmouseenter </strong>&#8211;</li>
<li><strong>onmouseleave </strong>&#8211;</li>
<li><strong>onmousemove </strong>&#8211;</li>
<li><strong>onmouseout </strong>&#8211;</li>
<li><strong>onmouseover </strong>&#8211;</li>
<li><strong>onmouseup </strong>&#8211;</li>
<li><strong>onmousewheel </strong>&#8211;</li>
<li><strong>onpause </strong>&#8211;</li>
<li><strong>onplay </strong>&#8211;</li>
<li><strong>onplaying </strong>&#8211;</li>
<li><strong>onprogress </strong>&#8211;</li>
<li><strong>onratechange </strong>&#8211;</li>
<li><strong>onreset </strong>&#8211;</li>
<li><strong>onresize </strong>&#8211;</li>
<li><strong>onscroll </strong>&#8211;</li>
<li><strong>onseeked </strong>&#8211;</li>
<li><strong>onseeking </strong>&#8211;</li>
<li><strong>onselect </strong>&#8211;</li>
<li><strong>onstalled </strong>&#8211;</li>
<li><strong>onsubmit </strong>&#8211;</li>
<li><strong>onsuspend </strong>&#8211;</li>
<li><strong>ontimeupdate </strong>&#8211;</li>
<li><strong>ontoggle </strong>&#8211;</li>
<li><strong>onvolumechange </strong>&#8211;</li>
<li><strong>onwaiting </strong>&#8211;</li>
<li><strong>onwebkitanimationend </strong>&#8211;</li>
<li><strong>onwebkitanimationiteration </strong>&#8211;</li>
<li><strong>onwebkitanimationstart </strong>&#8211;</li>
<li><strong>onwebkitanimationend </strong>&#8211;</li>
<li><strong>onwheel </strong>&#8211;</li>
<li><strong>onauxclick </strong>&#8211;</li>
<li><strong>ongotpointercapture </strong>&#8211;</li>
<li><strong>onlostpointercapture </strong>&#8211;</li>
<li><strong>onpointerdown </strong>&#8211;</li>
<li><strong>onpointermove </strong>&#8211;</li>
<li><strong>onpointerup </strong>&#8211;</li>
<li><strong>onpointercancel </strong>&#8211;</li>
<li><strong>onpointerover </strong>&#8211;</li>
<li><strong>onpointerout </strong>&#8211;</li>
<li><strong>onpointerenter </strong>&#8211;</li>
<li><strong>onpointerleave </strong>&#8211;</li>
<li><strong>onselectstart </strong>&#8211;</li>
<li><strong>onselectionchange </strong>&#8211;</li>
<li><strong>onanimationend </strong>&#8211;</li>
<li><strong>onanimationiteration </strong>&#8211;</li>
<li><strong>onanimationstart </strong>&#8211;</li>
<li><strong>ontransitionend </strong>&#8211;</li>
<li><strong>onafterprint </strong>&#8211;</li>
<li><strong>onbeforeprint </strong>&#8211;</li>
<li><strong>onbeforeunload </strong>&#8211;</li>
<li><strong>onhashchange </strong>&#8211;</li>
<li><strong>onlanguagechange </strong>&#8211;</li>
<li><strong>onmessage </strong>&#8211;</li>
<li><strong>onmessageerror </strong>&#8211;</li>
<li><strong>onoffline </strong>&#8211;</li>
<li><strong>ononline </strong>&#8211;</li>
<li><strong>onpagehide </strong>&#8211;</li>
<li><strong>onpageshow </strong>&#8211;</li>
<li><strong>onpopstate </strong>&#8211;</li>
<li><strong>onrejectionhandled </strong>&#8211;</li>
<li><strong>onstorage </strong>&#8211;</li>
<li><strong>onunhandledrejection </strong>&#8211;</li>
<li><strong>onunload </strong>&#8211;</li>
<li><strong>open </strong>&#8211;</li>
<li><strong>ondevicemotion </strong>&#8211;</li>
<li><strong>ondeviceorientation </strong>&#8211;</li>
<li><strong>ondeviceorientationabsolute </strong>&#8211;</li>
<li><strong>onpointerrawupdate </strong>&#8211;</li>
<li><strong>openDatabase </strong>&#8211;</li>
</ul>
<h2>== P ==</h2>
<ul>
<li><strong>personalbar </strong>&#8211;</li>
<li><strong>parent </strong>&#8211;</li>
<li><strong>pageXOffset </strong>&#8211;</li>
<li><strong>pageYOffset </strong>&#8211;</li>
<li><strong>performance </strong>&#8211;</li>
<li><strong>postMessage </strong>&#8211;</li>
<li><strong>print </strong>&#8211;</li>
<li><strong>prompt </strong>&#8211; отображает диалоговое окно с необязательным запросом на ввод текста<span>: <code>result <span class="token operator">=</span> <span class="token function">prompt</span><span class="token punctuation">(</span>title<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token keyword">default</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></span>
<ul>
<li><span>Этот код отобразит модальное окно с текстом, полем для ввода текста и кнопками OK/Отмена.</span>
<ul>
<li><code>result</code> — это строка, содержащая текст, поступивший от пользователя или null.</li>
<li><code>title</code> &#8211; Текст для отображения в окне.</li>
<li><code>default</code> &#8211; Необязательный второй параметр, который устанавливает начальное значение в поле для текста в окне.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2>== Q ==</h2>
<ul>
<li><strong>queueMicrotask </strong>&#8211; <span class="seoSummary"><span>Метод, который подвергается воздействие на </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window"><code>Window</code></a> <span>или </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/Worker"><code>Worker</code></a> <span>интерфейсе, в очередь microtask , которая будет выполнено в безопасное время до контроля возвращения в цикл обработки событий браузера. </span></span><span><strong>Микрозадача</strong> &#8211; это короткая функция, которая будет выполняться после того, как текущая задача завершит свою работу, и когда нет другого кода, ожидающего запуска, до того, как управление контекстом выполнения будет возвращено в цикл событий браузера. Это позволяет вашему коду выполняться без вмешательства в любой другой ожидающий выполнения код с потенциально более высоким приоритетом, но до того, как браузер восстановит контроль над контекстом выполнения, что может зависеть от работы, которую вам нужно выполнить.</span>
<ul>
<li>
<pre class="brush: js notranslate"><code>scope<span class="token punctuation">.</span><span class="token function">queueMicrotask</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
</ul>
</li>
<li><strong>qJsonp </strong>&#8211;</li>
<li><strong>qvangularGlobal </strong>&#8211;</li>
<li><strong>qListObject </strong>&#8211; <span>является базовым списком и подходит, если вы хотите создать список всех значений из поля. Объект списка &#8211; это визуализация, содержащая одно измерение. При получении макета объекта списка ( <code><span class="syntax">qListObjectDef</span></code> ) <span class="syntax">отображаются</span> все значения. Если выбор применяется к объекту списка, выбранные значения отображаются вместе с исключенными и дополнительными значениями.</span>
<ul>
<li><strong><span class="autonumber">Пример:</span> горизонтальный </strong><span class="syntax"><span><strong>список</strong> <code>initialProperties</code></span></span></li>
<li>
<pre class="EnlighterJSRAW" data-enlighter-language="js">initialProperties : {  
            version : 1.0,  
            qListObjectDef : {  
                qShowAlternatives : true,  
                qFrequencyMode : "V",  
                qSortCriterias : {  
                    qSortByState : 1  
                },  
                qInitialDataFetch : [{  
                    qWidth : 2,  
                    qHeight : 50  
                }]  
            },  
            fixed: true,  
            width: 25,  
            percent: true,  
            selectionMode: "CONFIRM"  
}</pre>
<p>&nbsp;</li>
</ul>
</li>
<li><strong>qHyperCube </strong>&#8211;</li>
<li><strong>qlik </strong>&#8211;</li>
</ul>
<h2>== R ==</h2>
<ul>
<li><strong>rows </strong>&#8211;</li>
<li><strong>releaseEvents </strong>&#8211;</li>
<li><strong>requestAnimationFrame </strong>&#8211;</li>
<li><strong>requestIdleCallback </strong>&#8211;</li>
<li><strong>resizeBy </strong>&#8211;</li>
<li><strong>resizeTo </strong>&#8211;</li>
<li><strong>regeneratorRuntime </strong>&#8211;</li>
<li><strong>require </strong>&#8211;</li>
<li><strong>requirejs </strong>&#8211;</li>
<li><strong>removeEventListener </strong>&#8211;</li>
<li><strong>return </strong>&#8211;</li>
<li><strong>reply </strong>&#8211;</li>
</ul>
<h2>== S ==</h2>
<ul>
<li><strong>self </strong>&#8211;</li>
<li><strong>scrollbars </strong>&#8211;</li>
<li><strong>statusbar </strong>&#8211;</li>
<li><strong>status </strong>&#8211;</li>
<li><strong>screen </strong>&#8211;</li>
<li><strong>scrollX </strong>&#8211;</li>
<li><strong>scrollY </strong>&#8211;</li>
<li><strong>screenX </strong>&#8211;</li>
<li><strong>screenY </strong>&#8211;</li>
<li><strong>screenLeft </strong>&#8211;</li>
<li><strong>screenTop </strong>&#8211;</li>
<li><strong>styleMedia </strong>&#8211;</li>
<li><strong>sessionStorage </strong>&#8211;</li>
<li><strong>scroll </strong>&#8211;</li>
<li><strong>scrollBy </strong>&#8211;</li>
<li><strong>scrollTo </strong>&#8211;</li>
<li><strong>setInterval </strong>&#8211; <span class="seoSummary"><span>Метод, предложенный на </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window"><code>Window</code></a> <span>и </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/Worker"><code>Worker</code></a> <span>интерфейсах, неоднократно вызывает функцию или выполняет фрагмент кода, с фиксированной задержкой по времени между каждым вызовом. </span></span><span>Он возвращает идентификатор интервала, который однозначно определяет интервал, поэтому вы можете удалить его позже, позвонив </span><code>clearInterval()</code><span>. Этот метод определяется </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope"><code>WindowOrWorkerGlobalScope</code></a> <span>миксином.</span>
<ul>
<li>
<pre class="brush: js notranslate"><code><span class="token keyword">var</span> intervalID <span class="token operator">=</span> scope<span class="token punctuation">.</span><span class="token function">setInterval</span><span class="token punctuation">(</span>func<span class="token punctuation">,</span> <span class="token punctuation">[</span>delay<span class="token punctuation">,</span> arg1<span class="token punctuation">,</span> arg2<span class="token punctuation">,</span> <span class="token operator">...</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
</ul>
</li>
<li><strong>setTimeout </strong>&#8211; <span>Метод </span><code>WindowOrWorkerGlobalScope</code> <span>Mixin (и преемника </span><code>Window.setTimeout()</code><span>) устанавливает таймер , который выполняет функцию или указанный фрагмент кода один раз, когда таймер истекает.</span>
<ul>
<li>
<pre class="brush: js notranslate"><code><span class="token keyword">var</span> timeoutID <span class="token operator">=</span> scope<span class="token punctuation">.</span><span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">[</span><span class="token punctuation">,</span> delay<span class="token punctuation">,</span> arg1<span class="token punctuation">,</span> arg2<span class="token punctuation">,</span> <span class="token operator">...</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
</li>
</ul>
</li>
<li><strong>stop </strong>&#8211;</li>
<li><strong>showDirectory </strong>&#8211;</li>
<li><strong>showOpenFilePicker </strong>&#8211;</li>
<li><strong>showSaveFilePicker </strong>&#8211;</li>
<li><strong>speechSynthesis </strong>&#8211;</li>
<li><strong>switch </strong>&#8211;</li>
</ul>
<h2>== T ==</h2>
<ul>
<li><strong>this </strong>&#8211;</li>
<li><strong>toolbar </strong>&#8211;</li>
<li><strong>top </strong>&#8211;</li>
<li><strong>trustedTypes </strong>&#8211;</li>
<li><strong>throw </strong>&#8211;</li>
<li><strong>true </strong>&#8211;</li>
<li><strong>try </strong>&#8211;</li>
<li><strong>typeof </strong>&#8211;</li>
</ul>
<h2>== V ==</h2>
<ul>
<li><strong>visualViewport </strong>&#8211;</li>
<li><strong>var </strong>&#8211;</li>
<li><strong>void </strong>&#8211;</li>
</ul>
<h2>== W ==</h2>
<ul>
<li><strong>window </strong>&#8211;</li>
<li><strong>webkitStorageInfo </strong>&#8211;</li>
<li><strong>webkitCancelAnimationFrame </strong>&#8211;</li>
<li><strong>webkitRequestAnimationFrame </strong>&#8211;</li>
<li><strong>webkitRequestFileSystem </strong>&#8211;</li>
<li><strong>webkitResolveLocalFileSystemURL </strong>&#8211;</li>
<li><strong>webpackJsonpsensei_codearea </strong>&#8211;</li>
<li><strong>while </strong>&#8211;</li>
<li><strong>with </strong>&#8211;</li>
</ul>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/">Обзор функций Javascript в редакторе Qlik Sense Extensions</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/overview-javascript-functions-extensions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Концепт Hypercube для Qlik Sense Developers</title>
		<link>https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/</link>
					<comments>https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Mon, 19 Aug 2019 15:02:36 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[initialProperties]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[qDimensions]]></category>
		<category><![CDATA[qHyperCubeDef]]></category>
		<category><![CDATA[qInitialDataFetch]]></category>
		<category><![CDATA[Qlik Data Engine]]></category>
		<category><![CDATA[Qlik Engine]]></category>
		<category><![CDATA[Qlik Sense Developers]]></category>
		<category><![CDATA[qMeasures]]></category>
		<category><![CDATA[Концепт Hypercube]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=1470</guid>

					<description><![CDATA[<p>HyperCube HyperCube можно считать сердцем большинства визуализаций. Это определение cube, предоставляемое Qlik Data Engine, которое содержит всю информацию о том, какие данные запрашиваются и как они рассчитываются. Если выборка (selections) применяется к HyperCube, отображаются только выбранные значения. HyperCube можно визуально представить как обычную прямую таблицу в Qlik с набором измерений<a class="moretag" href="https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/">Концепт Hypercube для Qlik Sense Developers</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">HyperCube</h2>



<p>HyperCube можно считать сердцем большинства визуализаций. Это определение cube, предоставляемое <strong>Qlik Data Engine</strong>, которое содержит всю информацию о том, какие данные запрашиваются и как они рассчитываются. Если выборка (selections) применяется к HyperCube, отображаются только выбранные значения.</p>
<p>HyperCube можно визуально представить как обычную прямую таблицу в Qlik с набором измерений и метрик, а также с дополнительными атрибутами.</p>
<p>Объект <code class="literal">qHyperCubeDef</code> играет значительную роль в создании визуализаций и других компонентов, которые в значительной степени зависят от механизма Qlik engine для расчетов.</p>



<h3 class="wp-block-heading">qHyperCubeDef</h3>



<p><code class="literal"></code><span style="font-size: inherit;"><code class="literal">qHyperCubeDef</code>&#8211; это описание объекта, который передается в API Qlik Engine для создания запроса для обработки. Большинство визуализаций, встроенных в Qlik Sense, основаны на определении HyperCube на корневом уровне (root level), то есть код расширения (extension) построен на этой технологии.</span></p>
<p>Фундаментальное определение <span style="font-size: inherit;"><strong>HyperCube</strong> (</span>гиперкуба) выглядит следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">initialProperties:{
    version:1.0,
    qHyperCubeDef:{
    qDimensions:[],
    qMeasures:[],
    qInitialDataFetch:[{
        qWidth:2,
        qHeight:50
}]
  }
}</pre>
<p><strong>По-умолчанию</strong>, большинство расширений (extensions) не будут иметь никаких измерений или мер, определенных в их первоначальных свойствах (<code class="literal">initialProperties</code>), чтобы позволить пользователю достичь того же самого путем добавления измерений и метрики через панель свойств.</p>
<blockquote>
<p>Всегда добавляйте <code class="literal">initialProperties</code>, чтобы определить, сколько строк / столбцов доступно в вашем объекте JavaScript. При изменении начальных свойств <code class="literal">initialProperties</code> удалите и повторно добавьте расширение визуализации (<span>visualization extension)</span>; простого обновления страницы (F5) будет недостаточно.</p>
</blockquote>
<p>Размер фактического HyperCube в Qlik Engine определяется числом результирующих строк после его вычисления. Иногда HyperCube может быть огромным, и поэтому <strong>qInitialDataFetch</strong> позволяет вам определить, сколько из этих ячеек данных будет возвращено в код расширения. Это задается через параметры с <code class="literal">qWidth</code> и <code class="literal">qHeight</code>.</p>
<blockquote>
<p>Произведение параметров <span class="emphasis"><em>qWidth*qHeight</em></span> никогда не может превышать 10000 ячеек данных. Если вам необходимо вернуть более 10 000 ячеек данных для конкретного варианта использования или визуализации, вам потребуется реализовать последующую нумерацию (subsequent pagination) страниц в своем коде.</p>
</blockquote>



<h3 class="wp-block-heading">qHyperCubeDef properties &#8211; свойства</h3>



<p>Существует несколько высокоуровневых свойств, которые могут помочь изменить и установить базовый HyperCube, даже за пределами измерений и мер.</p>



<h4 class="wp-block-heading">qDimensions</h4>



<p><strong>qDimensions </strong>определяет массив измерений, которые будут использоваться в HyperCube. Обычно qDimensions определяется с помощью панели свойств, но это также может быть сделано вручную непосредственно в файле JSON. Последнее рекомендуется только для использования в мэшапах (mashup), когда вы определяете визуализацию на лету.</p>
<p>В дополнение к имени измерения (dimension name), Вы также можете определить параметры, такие как:</p>
<blockquote>
<ul type="bullet">
<li><code class="literal">qNullSuppression</code> &#8211; подавляет нулевые значения в измерении</li>
<li><code class="literal">qShowAll</code> &#8211; если задано значение true, отображает все значения измерений, независимо от того, выбраны ли они</li>
<li><code class="literal">qCalcCond</code> &#8211; устанавливает условие вычисления, которое должно быть выполнено для вычисления измерения</li>
<li><code class="literal">qTotalLabel</code> и <code class="literal">qOtherLabel</code> перемаркировка (переименовывание) меток Other и Total в возвращенном HyperCube</li>
</ul>
</blockquote>
<p>Если вы используете панель свойств (property panel) для определения измерений, простое использование этих свойств в качестве ссылочных значений позволяет вам определять их напрямую, например:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">suppressNulls:{
    type:"boolean",
    ref:"qNullSuppression",
    label:"Suppress Nulls",
    defaultValue: false
},</pre>



<h4 class="wp-block-heading">qMeasures</h4>



<p><code>qMeasures</code>&nbsp;очень похож на qDimensions, но помогает вам определить меры. Как и в случае с измерениями, они обычно задаются через панель свойств (property panel). </p>



<h4 class="wp-block-heading">qInitialDataFetch</h4>



<p><code>qInitialDataFetch</code>&nbsp;помогает определить, сколько ячеек данных первоначально извлекается из вычисленного HyperCube. </p>



<h4 class="wp-block-heading">qStateName</h4>



<p><code>qStateName</code>&nbsp;помогает определить имя альтернативного состояния, при этом $ (текущий выбор) является значением по умолчанию. Альтернативные состояния помогают создать виртуальный образ выборок, основанных на том же наборе данных, но не затронутых выборками, сделанными в других состояниях. В основном используется для сравнительного анализа. </p>



<h4 class="wp-block-heading">qInterColumnSortOrder</h4>



<p>Свойство <code>qInterColumnSortOrder</code>&nbsp;помогает определить порядок сортировки по столбцам в HyperCube. Он определяется с помощью массива целых чисел, например, [1,3,2,0], который указывает, в каком порядке будут сортироваться столбцы. </p>



<h4 class="wp-block-heading">qSuppressZero</h4>



<p><code>qSuppressZero</code>&nbsp;удаляет строки с нулевыми значениями во всей строке HyperCube, если установлено значение true. </p>



<h4 class="wp-block-heading">qSuppressMissing</h4>



<p><code>qSuppressMissing</code>&nbsp;удаляет строки, в которых отсутствуют значения по всей строке HyperCube, если установлено значение true. </p>



<h4 class="wp-block-heading">qMode</h4>



<p><code>qMode</code>&nbsp;определяет, в какой структуре будет возвращен HyperCube. По умолчанию и для большинства соответствующих случаев использования режим данных возвращается в виде таблицы. Дополнительные расширенные режимы доступны следующим образом:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Pivot Table&nbsp;representation &#8211; Представление сводной таблицы (<code>qMode P</code>)</p><p>Stacked Table representation &#8211; Представление Стековая таблица (<code>qMode K</code>)</p><p>Tree representation &#8211; Представление дерева (<code>qMode T</code>)</p></blockquote>



<p>Эти различные типы представлений являются расширенными и возвращают Вам предварительно агрегированный формат базовых измерений и мер, включая промежуточные итоги. </p>



<h4 class="wp-block-heading">qNoOfLeftDims</h4>



<p>Это свойство применяется к сводным таблицам и сложенным сводным таблицам.</p>



<p>В структуре сводной таблицы этот параметр используется, чтобы помочь определить, сколько и какие измерения заданы в виде строк, а какие повернуты по горизонтали (отображаются в столбцах). Это относительно продвинутый вариант, и дополнительную документацию по этому вопросу можно найти на странице справки Qlik Sense.</p>



<h4 class="wp-block-heading">qAlwaysFullyExpanded</h4>



<p>Это свойство применяется к сводным таблицам и сложенным сводным таблицам.</p>



<p>Это свойство гарантирует, что ячейки всегда раскрыты (Fully Expanded), если установлено значение true.</p>



<h4 class="wp-block-heading">qMaxStackedCells</h4>



<p>В сложенном режиме/в режиме с накоплением (qMode = K), этот параметр определяет максимальное количество ячеек для начальной выборки данных (по умолчанию 5000).</p>



<h4 class="wp-block-heading">qPopulateMissing</h4>



<p>Пропущенные значения или нули возвращаются как дефисы (-) в модели данных.&nbsp;<code>qPopulateMissing</code>&nbsp;заменяет числовые нули на 0, а строковые нули &#8211; пустыми строками.&nbsp; </p>



<h4 class="wp-block-heading">qShowTotalsAbove</h4>



<p>Если true, он возвращает итоговую строку в первой строке гиперкуба. Их также можно получить from&nbsp;<code>qHyperCube.qGrandTotalRow[i].qNum</code>. </p>



<h4 class="wp-block-heading">qIndentMode</h4>



<p>Это свойство применяется к сводным таблицам и сложенным сводным таблицам.</p>



<p>Это свойство применяет отступ для сводных таблиц и позволяет изменять макет таблицы (<code>layout</code>), добавляя отступ в начало каждой строки.</p>



<h4 class="wp-block-heading">qCalcCond</h4>



<p><code>qCalcCond</code>&nbsp;определяет условие вычисления для всего гиперкуба для вычисления. Это особенно полезно, когда у вас широкие таблицы с очень сложными вычислениями, и вы хотите убедиться, что пользователь отфильтровал подмножество данных перед запуском вычисления в движок Qlik. Тяжелые вычисления не только увеличивают время расчета, но и увеличивают использование RAM на вашем сервере Qlik Sense. </p>



<h4 class="wp-block-heading">qSortbyYValue</h4>



<p>Это свойство применяется к сводным таблицам и сложенным сводным таблицам.</p>



<p><code>qSortbyYValue</code>&nbsp;включает сортировку по возрастанию или убыванию в значениях меры.</p>



<h3 class="wp-block-heading">Возращаемая структура qHyperCube structure</h3>



<p><span>Как только </span><code class="literal">qHyperCubeDef</code><span> определен с помощью набора свойств или с помощью панели свойств</span>, Qlik Engine рассчитывает HyperCube при каждой выборке и взаимодействии с Qlik engine. После расчета он возвращает структуру<span>&nbsp;</span><code class="literal">qHyperCube</code><span>&nbsp;</span>в<span>&nbsp;</span><code class="literal">layout</code>&nbsp;вместе с результатами.</p>
<p>В расширении (extension) <strong>MasteringQS</strong>&nbsp;следующий пример иллюстрирует возвращенный вычисленный<span>&nbsp;</span><code class="literal">qHyperCube</code> для образца измерения и метрики:</p>
<p><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/propertyjs_panel_values_extensionMeta_qHyperCube.png" alt="" width="665" height="708" class="aligncenter size-full wp-image-1475" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/propertyjs_panel_values_extensionMeta_qHyperCube.png 665w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/propertyjs_panel_values_extensionMeta_qHyperCube-282x300.png 282w" sizes="(max-width: 665px) 100vw, 665px" /></p>
<p><span>Теперь Вы, наверное, можете интуитивно распознать большинство&nbsp; объектов и переменных. Любое свойство, начинающееся с буквы q, является свойством определения Qlik; однако есть некоторые дополнительные, которые не имеют префикса (например, заголовок и подзаголовок).</span></p>
<blockquote>
<p><span>Кроме того, вместе с </span><code class="literal">qHyperCube</code><span>, </span><code class="literal">layout</code><span>&nbsp;также возвращает информацию, хранящуюся в файле</span><code class="literal">.qext</code><span> которую можно получить через свойство объекта </span><code class="literal">extensionMeta</code><span>. То же самое относится к пользовательским свойствам, определенным в файле <strong>properties.js</strong>, которые также возвращаются в </span><code class="literal">layout</code><span> ,вместе с </span><code class="literal">qHyperCube</code><span>, например </span><code class="literal">fontSize</code><span>,</span><code class="literal">fontFamily</code><span>, и так далее.</span></p>
</blockquote>
<p>Для начала обратите внимание на следующие объекты:</p>
<div class="itemizedlist">
<ul type="bullet">
<li><code class="literal">layout.qHyperCube.qDimensionInfo</code>: Used dimensions (Используемые измерения)</li>
<li><code class="literal">layout.qHyperCube.qMeasureInfo</code>: Used measures (Используемые меры)</li>
<li><code class="literal">layout.qHyperCube.qDataPages</code>: Результат</li>
<li><code class="literal">layout.qHyperCube.qSize</code>: The page size (Размер страницы/Размер гиперкуба)</li>
</ul>
</div>
<p>Из этих трех наиболее актуальным является, конечно,<span>&nbsp;</span><code class="literal">qDataPages</code>, который содержит рассчитанные данные:</p>
<p><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/return_size_of_data_qDataPages.png" alt="" width="509" height="428" class="aligncenter size-full wp-image-1476" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/return_size_of_data_qDataPages.png 509w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/return_size_of_data_qDataPages-300x252.png 300w" sizes="(max-width: 509px) 100vw, 509px" /></p>
<p><span>Если вы развернете узел </span><code class="literal">qDataPages</code>, то вы увидите следующее you:</p>
<div class="itemizedlist">
<ul type="bullet">
<li><code class="literal">qDataPages</code><span> это массив</span></li>
<li><span>данные хранятся в </span><code class="literal">qDataPages[0].qMatrix</code>, который снова является массивом объектов, представляющих строки, каждый из которых снова содержит массив некоторых других объектов, представляющих отдельные ячейки (столбцы для каждой строки)</li>
</ul>
</div>
<p>В свою очередь каждая ячейка содержит следующую информацию:</p>
<div class="itemizedlist">
<ul type="bullet">
<li><code class="literal">qText</code>, текстовое представление результирующего значения ячейки</li>
<li><code class="literal">qNum</code>, если число, то вернет Вам числовое значение</li>
<li>Если ячейка является измерением,<span>&nbsp;</span><code class="literal">qElemNumber</code><span> предоставит вам внутренний идентификатор значения измерения, который можно использовать для выбора с помощью</span>&nbsp;<code class="literal">qState</code>, состояния выборки объекта</li>
</ul>
</div>
<p><span>Одной из типичных задач является преобразование данных </span><code class="literal">qDataPages.qMatrix</code><span> в массив объектов другого формата для лучшей обработки в коде расширения</span>.</p>
<p><span>Например, если вы знаете, что у вас всегда будет только одно значение измерения и одна метрика, преобразование структуры данных в нечто более удобное для вашего кода может быть выполнено с помощью функции </span><code class="literal">.map()</code><span>, которая выглядит следующим образом</span>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">var data = [];
 data = scope.layout.qHyperCube.qDataPages[0].qMatrix.map(function(d) {
 return {
     dimensionvalue: d[0].qText,
     measurevalue: d[1].qNum
 };
 })</pre>
<p><span>Результат выглядит намного дружелюбнее:</span></p>
<p><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/result_hypercube_dimensionvalue_measurevalue.png" alt="" width="471" height="372" class="aligncenter size-full wp-image-1479" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/result_hypercube_dimensionvalue_measurevalue.png 471w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/result_hypercube_dimensionvalue_measurevalue-300x237.png 300w" sizes="(max-width: 471px) 100vw, 471px" /></p>



<h3 class="wp-block-heading">qListObjectDef</h3>



<p>The family of generic objects<span>&nbsp;</span><span>has</span><span>&nbsp;</span>provided<span>&nbsp;</span><code class="literal">qHyperCube</code><span>&nbsp;</span>with a sister called the<span>&nbsp;</span><code class="literal">qListObject</code>. Unlike a HyperCube, a list object better serves the<span>&nbsp;</span><span>purposes</span><a id="id288633443" class="indexterm"></a><span>&nbsp;</span>of displaying one single dimension<span>&nbsp;</span><span class="emphasis"><em>without</em></span><span>&nbsp;</span>any required calculation, meaning no metrics are required to be defined. As such, it is fairly straightforward to work the list objects, and their definition is very similar to the<span>&nbsp;</span><code class="literal">qHyperCube</code><span>&nbsp;</span>object, with some added extra properties but without measures.&nbsp;</p>
<p>The following code is an example of creating a<span>&nbsp;</span><code class="literal">qListObjectDef</code><span>&nbsp;</span>and writing the resulting list object into the console:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">//DefineListObject
var obj = {
    "qDef": {
    "qFieldDefs": ["Case Owner"]
    },
    "qShowAlternatives" : true,
    "qInitialDataFetch": [{
        qTop : 0,
        qLeft : 0,
        qHeight : 10000,
        qWidth : 1
    }]
    };

var app = qlik.currApp(this);

//Create the listbox as a session object which will persist over the //session and then be deleted.
app.createList(obj,function(listobject) {
  console.log(listobject)
})</pre>



<p><span>Код возвращает следующий результат:</span></p>
<p><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/qListObjectDef_result.png" alt="" width="398" height="609" class="aligncenter size-full wp-image-1480" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/qListObjectDef_result.png 398w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2019/08/qListObjectDef_result-196x300.png 196w" sizes="(max-width: 398px) 100vw, 398px" /></p>
<p><span>Это структура, очень похожая на </span><code class="literal">qHyperCube</code>, с ее<span>&nbsp;</span><code class="literal">qDataPages</code>, но с дополнительной информацией о найденном объекте измерения и списка.</p>
<p><span>Помимо классических свойств, уже описанных для </span><code class="literal">qHyperCube</code>, для объекта<span>&nbsp;</span><code class="literal">qListObject</code> вы можете определить следующие параметры:</p>
<div class="itemizedlist">
<ul type="bullet">
<li><code class="literal">qAutoSortByState</code>: определяет сортировку по состоянию.</li>
<li><code class="literal">qFrequencyMode</code>: Определяет frequency mode используемый для расчета частоты значения в объекте списка. Этот параметр является необязательным, и по умолчанию частота не возвращается (<code class="literal">NX_FREQUENCY_NONE</code>). Альтернативные значения:<span>&nbsp;</span><code class="literal">NX_FREQUENCY_VALUE</code>,<span>&nbsp;</span><code class="literal">NX_FREQUENCY_PERCENT</code>, и<span>&nbsp;</span><code class="literal">NQ_FREQUENCY_RELATIVE</code>.</li>
<li><code class="literal">qShowAlternatives</code>: если для этого параметра установлено значение <strong>true</strong>, это позволит включить альтернативные значения в возвращаемые данные <strong>qData</strong>. Если установлено значение <strong>false</strong>, альтернативные значения не отображаются в <code class="literal"><span>qData</span></code>&nbsp;(Вместо этого значения исключены). <code class="literal">qStateCounts</code><span> считает исключенные значения в качестве альтернативных значений</span>.</li>
</ul>
<blockquote>
<p><span>Важно отметить, что с помощью </span><code class="literal">qListObject</code><span>, все значения отображаются независимо от того, были они исключены или нет. Если выбор применяется к объекту списка, выбранные значения отображаются вместе с исключенными и дополнительными значениями.</span></p>
</blockquote>
</div>



<h3 class="wp-block-heading">qStringExpression и qValueExpression</h3>



<p><span>Для простоты одноразовых вычислений, в которых вы просто хотите использовать всю мощь механизма <strong>Qlik Sense Engine</strong>, </span><code class="literal">qStringExpression</code><span> и&nbsp;</span><code class="literal">qValueExpression</code><span> являются младшими сестрами</span><span>&nbsp;</span><code class="literal">qHyperCube</code><span> и&nbsp;</span><code class="literal">qListObject</code><span>. Они работают, используя ту же концепцию, что и остальные, но на более простом уровне: все, что вам нужно сделать, это определить выражение Qlik, и механизм вернет вам свой результат</span><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">var app = qlik.currApp(this);
app.createGenericObject({
    user: {
qStringExpression:"=OSUser()"
    }, 
    version: {
qStringExpression:"=EngineVersion()"
    }, 
    fields: { 
qValueExpression:"=Count (DISTINCT $Field)"
    } 
}, function ( reply ) { 
    var str = "Version:" + reply.version + 
        str+= " Number of Fields:"+reply.fields; 
    if(reply.user) { 
        str += " User:" + reply.user; 
    }
    console.log(str)
}</pre>
<p><span>Использование этих определений объектов очень удобно в сочетании с другими объектами, такими как </span><code class="literal">qHyperCube</code><span>.</span></p>
<blockquote>
<p><span>Знак </span><code class="literal">=</code><span> в строковом выражении не является обязательным. Даже если знак </span><code class="literal">=</code><span> не указан, выражение вычисляется. Строковое выражение не оценивается, если выражение окружено чистыми кавычками.</span></p>
</blockquote>



<h2 class="wp-block-heading">Kill the hypercubes</h2>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Kill the hypercubes" width="750" height="563" src="https://www.youtube.com/embed/-w-d1Am2cjY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption> See how to manage and clean up  hypercubes in a Qlik Sense Mashup. </figcaption></figure>



<p>Find the code shown in this video for both the Visualization API and the Capabilities API: <a href="https://github.com/ChristofSchwarz/qs-mash-KillHypercube" target="_blank" rel="noreferrer noopener" aria-label="https://github.com/ChristofSchwarz/qs-mash-KillHypercube (opens in a new tab)">https://github.com/ChristofSchwarz/qs-mash-KillHypercube</a></p>



<h2 class="wp-block-heading">Mash-Up APIs Part 4: Creating Hypercubes</h2>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Mash-Up APIs Part 4: Creating Hypercubes" width="750" height="422" src="https://www.youtube.com/embed/pDbDbkc22Ds?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption> In Part 4, we’ll explain the power of HyperCubes and how to use them in your web applications.</figcaption></figure>



<h2 class="wp-block-heading">Qlik Sense Tutorial | Creating Qlik Sense Mashup by using Hypercube</h2>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Qlik Sense Tutorial | Creating Qlik Sense Mashup by using Hypercube" width="750" height="422" src="https://www.youtube.com/embed/D_cDvUTps80?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption> We provide industry standard online training on Qlik Sense Development , Administration and live project development with hand-holding support of expert trainer. For Instructor lead live Qlik Sense online training, please feel free to get back to us on below contact details.</figcaption></figure>



<h2 class="wp-block-heading">Mash-Up APIs Part 3: Connecting to Fields</h2>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Mash-Up APIs Part 3: Connecting to Fields" width="750" height="422" src="https://www.youtube.com/embed/fqGwrGhlW-I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption> Learn how to connect and hook into fields in the Qlik Sense data model and use them on your web site. </figcaption></figure>



<h2 class="wp-block-heading">Getting started building mashup &#8211; Qlik Sense</h2>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Getting started building mashup - Qlik Sense" width="750" height="422" src="https://www.youtube.com/embed/dyTAXzcgR5E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption> The Mashup editor assists you in creating your mashups displaying Qlik Sense data on your website. This video shows you how to create your first mashup in Qlik Sense Developer Hub, how to add objects from multiple Qlik Sense apps, how to create a list and a hypercube, and how to import asset files.</figcaption></figure>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/">Концепт Hypercube для Qlik Sense Developers</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/hypercube-concept-for-qlik-sense-developers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qlik Sense November 2018 &#8211; What&#8217;s New</title>
		<link>https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/</link>
					<comments>https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Fri, 30 Nov 2018 06:19:00 +0000</pubDate>
				<category><![CDATA[Новости Qlik Sense]]></category>
		<category><![CDATA[Dashboard extension bundle]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[qlik sense]]></category>
		<category><![CDATA[qlik sense desktop]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<category><![CDATA[Qlik Sense November 2018]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=778</guid>

					<description><![CDATA[<p>Майк Таралло из Qlik рассказывает, что нового в последней версии Qlik Sense &#8211; ноябрь 2018 года. Precedent Machine Learning (Insight Advisor &#8211; Enterprise only) Dashboard Extension Bundle New Chart Map Layer Enhanced Pie Chart (2 measures &#8211; Rose, Polar) Alternate States Single Selections Set Analysis Expression Editor improvements Обязательно ознакомьтесь<a class="moretag" href="https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/">Qlik Sense November 2018 &#8211; What&#8217;s New</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><iframe width="560" height="315" src="https://www.youtube.com/embed/t2JWSzFVwh8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="allowfullscreen"></iframe></p>
<p>Майк Таралло из Qlik рассказывает, что нового в последней версии Qlik Sense &#8211; ноябрь 2018 года.</p>
<ul>
<li>Precedent Machine Learning (Insight Advisor &#8211; Enterprise only)</li>
<li>Dashboard Extension Bundle</li>
<li>New Chart Map Layer</li>
<li>Enhanced Pie Chart (2 measures &#8211; Rose, Polar)</li>
<li>Alternate States</li>
<li>Single Selections</li>
<li>Set Analysis Expression Editor improvements</li>
</ul>
<p>Обязательно ознакомьтесь с нашими примечаниями к выпуску на сайте загрузки клиента Qlik.<br />
<strong><a href="https://community.qlik.com/t5/New-to-Qlik-Sense/Demonstration-Qlik-Sense-Apps-November-2018/m-p/1506305" target="_blank" rel="noopener">Demonstration Qlik Sense Apps November 2018</a></strong></p>
<h1><strong>Dashboard extension bundle &#8211; Qlik Sense</strong></h1>
<p>Официальный набор Extensions от Qlik, которые они будут поддерживать при переходе к новой версии.<br />
<iframe width="560" height="315" src="https://www.youtube.com/embed/XS_2Nqab4Ms" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="allowfullscreen"></iframe></p>
<p>Ссылки на описание расширений. <strong><span style="color: #ff0000;">НЕ УСТАНАВЛИВАЙТЕ РАСШИРЕНИЯ С GITHUB</span></strong>. Только через официальный инсталлятор Qlik Sense Desktop.</p>
<ul>
<li><a href="https://github.com/NOD507/SenseDateRangePicker"><strong>https://github.com/NOD507/SenseDateRangePicker</strong></a></li>
<li><strong><a href="https://github.com/stefanwalther/sense-navigation">https://github.com/stefanwalther/sense-navigation</a></strong></li>
<li><strong><a href="https://github.com/bohua/nprinting-sense-on-demand">https://github.com/bohua/nprinting-sense-on-demand</a></strong></li>
<li><strong><a href="https://github.com/fadyheiba/ShowHide">https://github.com/fadyheiba/ShowHide</a></strong></li>
<li><strong><a href="https://github.com/mhamano/Qlik-Sense-Tabs">https://github.com/mhamano/Qlik-Sense-Tabs</a></strong></li>
<li><strong><a href="https://github.com/erikwett/qsVariable">https://github.com/erikwett/qsVariable</a></strong></li>
</ul>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/">Qlik Sense November 2018 &#8211; What&#8217;s New</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/qlik-sense-november-2018-whats-new/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
