<?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>Building visualization extensions - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<atom:link href="https://qliksense.ivan-shamaev.ru/tag/building-visualization-extensions/feed/" rel="self" type="application/rss+xml" />
	<link>https://qliksense.ivan-shamaev.ru/tag/building-visualization-extensions/</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>Building visualization extensions - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<link>https://qliksense.ivan-shamaev.ru/tag/building-visualization-extensions/</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>Панель свойств расширения или Properties Panel</title>
		<link>https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/</link>
					<comments>https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Fri, 12 Feb 2021 20:27:45 +0000</pubDate>
				<category><![CDATA[Уровень 2]]></category>
		<category><![CDATA[Building a properties panel]]></category>
		<category><![CDATA[Building visualization extensions]]></category>
		<category><![CDATA[custom properties]]></category>
		<category><![CDATA[extension custom properties]]></category>
		<category><![CDATA[Properties panel basics]]></category>
		<category><![CDATA[Qlik Sense Extension]]></category>
		<category><![CDATA[Qlik Sense Extensions]]></category>
		<category><![CDATA[Reusable Properties]]></category>
		<category><![CDATA[как задать свойства расширения]]></category>
		<category><![CDATA[Настраиваемые свойства Extension]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2580</guid>

					<description><![CDATA[<p>Создание панели свойств Qlik Sense Extension Введение в свойства расширения. Что такое панель свойств? Перед тем, как перейти к разработке Qlik Sense Visualization Extensions, необходимо понять основные принципы определения и использования свойств в Qlik Sense расширениях. Основная идея свойств состоит в том, чтобы предложить пользователям способ настройки поведения расширений визуализации таким же<a class="moretag" href="https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/">Панель свойств расширения или Properties Panel</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Создание панели свойств Qlik Sense Extension</h1>
<h2>Введение в свойства расширения. Что такое панель свойств?</h2>
<p>Перед тем, как перейти к разработке Qlik Sense Visualization Extensions, необходимо понять основные принципы определения и использования свойств в Qlik Sense расширениях.</p>
<p><span>Основная идея свойств состоит в том, чтобы предложить пользователям способ настройки поведения </span><em><span>расширений визуализации</span></em><span> таким же образом, как они будут управлять собственными объектами Qlik Sense. Поэтому разработчик расширения может использовать программный интерфейс для определения свойств, которые затем отображаются на правой панели свойств.</span></p>
<h2>Определение панели свойств</h2>
<p><span>Свойства структурированы иерархически (есть еще такой термин, как аккордеон панели свойств):</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Panel_Properties_Customization_Developing.png"><img fetchpriority="high" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Panel_Properties_Customization_Developing.png" alt="" width="242" height="481" class="aligncenter size-full wp-image-2583" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Panel_Properties_Customization_Developing.png 242w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Panel_Properties_Customization_Developing-151x300.png 151w" sizes="(max-width: 242px) 100vw, 242px" /></a></p>
<p>A &#8211; Sections<br />
B &#8211; Header<br />
C &#8211; Items</p>
<p>Есть еще одна иллюстрация (с сайта <strong><a href="http://qliksite.io/tutorials/qliksense-visualization-extensions/part-01/06-Introduction-to-Using-Properties/" target="_blank" rel="noopener">http://qliksite.io/tutorials/qliksense-visualization-extensions/part-01/06-Introduction-to-Using-Properties/</a></strong>):</p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Development_Accordion_Concept.png"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Development_Accordion_Concept.png" alt="" width="582" height="466" class="aligncenter size-full wp-image-2584" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Development_Accordion_Concept.png 582w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Extension_Development_Accordion_Concept-300x240.png 300w" sizes="(max-width: 582px) 100vw, 582px" /></a></p>
<p><strong>Accordion</strong><span></span></p>
<ul>
<li>Accordion<span> </span><strong>sections</strong>
<ul>
<li>Section<span> </span><strong>headers</strong>
<ul>
<li>Property<span> </span><strong>items</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><span>Свойства добавляются путем их </span><span class="syntax"><span>определения в</span></span><span> свойстве <code>definition</code> в файле JavaScript. </span></p>
<p><strong>Есть два способа определения свойств:</strong></p>
<ul>
<li><span>Повторное использование существующих встроенных свойств (</span>Reusing existing, built-in, properties)</li>
<li><span>Создать настраиваемые свойства (custom properties)</span></li>
</ul>
<p><strong>Reusable Properties:</strong></p>
<ul>
<li>Dimensions</li>
<li>Measures</li>
<li>Sorting</li>
<li>Appearance</li>
<li>Add-Ons</li>
</ul>
<h3><madcap:concept term="Building visualization extensions" xmlns:madcap="http://www.madcapsoftware.com/Schemas/MadCap.xsd"><span>Повторное использование существующих свойств</span></madcap:concept></h3>
<p><span>Вот некоторые типичные свойства, используемые для наиболее распространенных встроенных визуализаций </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span>:</span></p>
<ul>
<li><span>Все собственные визуализации имеют раздел </span><span class="ui_item"><span>Внешний вид</span></span><span> с заголовком раздела </span><span class="ui_item"><span>Общие</span></span><span> .</span></li>
<li><span>Большинство встроенных визуализаций позволяют определять </span><span class="ui_item"><span>измерения</span></span><span> и </span><span class="ui_item"><span>меры</span></span><span> .</span></li>
</ul>
<h4 id="anchor-1" tabindex="-1"><span>Определение свойств</span></h4>
<p><span>Если вы создаете расширение визуализации без defining a properties panel, </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span> по умолчанию будет включать раздел <strong>&#8220;</strong></span><strong><span class="ui_item">Внешний вид</span></strong><span><strong>&#8220;</strong> или <strong>&#8220;<span class="ui_item">Appearance</span> section&#8221;</strong>.</span></p>
<p><span>Тот же результат будет достигнут при повторном использовании раздела </span><span class="syntax"><span>настроек</span></span><span>, который является внутренним именем раздела Внешний вид.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [
        'jquery'
    ],
    function ( $ ) {
        'use strict';

        return {

            // Define what the properties panel looks like
            definition: {
                type: "items",
                component: "accordion",
                items: {
                    appearance: {
                        uses: "settings",
                    }
                }
            },
            // Paint/Rendering logic
            paint: function ( $element /*, layout*/ ) {

                $element.empty();
                var $msg = $( document.createElement( 'div' ) );
                $msg.html( 'Just demonstrating default behavior of the property panel"' );
                $element.append( $msg );

            }
        };

    } );</pre>
<p><span>На основе приведенного выше кода вы теперь можете расширить <code><span class="syntax">definition</span></code> </span><span>для повторного использования других встроенных разделов. В этом примере мы также повторно будем использовать разделы измерений, мер и сортировки.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Define what the properties panel looks like
definition: {
    type: "items",
    component: "accordion",
    items: {
        dimensions: {
            uses: "dimensions"
        },
        measures: {
            uses: "measures"
        },
        sorting: {
            uses: "sorting"
        },
        appearance: {
            uses: "settings",
        }
    }
},</pre>
<p>В результате мы получим следующую панель свойств:</p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript.jpg"><img decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript.jpg" alt="" width="324" height="368" class="aligncenter size-full wp-image-2585" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript.jpg 324w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript-264x300.jpg 264w" sizes="(max-width: 324px) 100vw, 324px" /></a></p>
<h4 id="anchor-2" tabindex="-1"><span>Ссылка на свойства</span></h4>
<p><span>Параметр макета (layout) передается в метод paint, и он включает текущую область расширения визуализации вместе с определенными свойствами.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Paint/Rendering logic
paint: function ( $element, layout ) {

    console.info('paint &gt;&gt; layout &gt;&gt; ', layout);

}</pre>
<p><span>Если вы посмотрите на вывод консоли, например, в Chrome DevTools, вы найдете то, что ищете.</span></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/chrome_devtools_properties_console_log_print.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/chrome_devtools_properties_console_log_print.png" alt="" width="953" height="253" class="aligncenter size-full wp-image-2586" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/chrome_devtools_properties_console_log_print.png 953w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/chrome_devtools_properties_console_log_print-300x80.png 300w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/chrome_devtools_properties_console_log_print-768x204.png 768w" sizes="(max-width: 953px) 100vw, 953px" /></a></p>
<p><span>С этой информацией теперь вы можете начать выводить некоторые значения в метод <code>paint</code></span><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Paint/Rendering logic
paint: function ( $element, layout ) {

    //output values from the property panel
    $element.empty();
    
    //output container
    var $msg = $( document.createElement( 'div' ) );
    
    //variable holding the output
    var html = '&lt;b&gt;Property values:&lt;/b&gt;&lt;br/&gt;';
    html += 'Title: ' + layout.title + '&lt;br/&gt;';
    html += 'Subtitle: ' + layout.subtitle + '&lt;br/&gt;';
    
    //assign the variable to the output container
    $msg.html( html );
    
    //add the output container to the current element
    $element.append( $msg );

}</pre>
<p>Получим следующий результат:</p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript_example2.jpg"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript_example2.jpg" alt="" width="549" height="495" class="aligncenter size-full wp-image-2587" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript_example2.jpg 549w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Qlik_Sense_Custom_Properties_result_of_javascript_example2-300x270.jpg 300w" sizes="(max-width: 549px) 100vw, 549px" /></a></p>
<h3 id="anchor-3" tabindex="-1"><span>Собственные свойства, которые можно использовать повторно</span></h3>
<p><span>В этом разделе перечислены собственные свойства </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense,</span></span><span> которые можно повторно использовать в определении панели свойств.</span></p>
<h4>Dimensions</h4>
<p><span>Когда вы повторно используете раздел</span> Dimensions section, <span>он включает в себя следующее</span>:</p>
<ul>
<li>Add dimension</li>
</ul>
<p><span>После добавления измерения у вас есть следующие свойства по умолчанию</span>:</p>
<ul>
<li>Field</li>
<li>Label</li>
<li>Show null values</li>
<li>Limitation</li>
<li>Show others</li>
<li>Others label</li>
</ul>
<p><strong>Пример: Add Dimensions section</strong></p>
<p><span>В приведенном ниже примере показано, как добавить раздел &#8220;<strong>Dimensions</strong>&#8221; на панель свойств вашего расширения визуализации. </span><span>Обратите внимание, что определено, что расширение визуализации должно иметь ровно одно измерение.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [], function ( ) {
    
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: {
                uses: "dimensions",
                min: 1,
                max: 1
            }
        }
    };
 
});</pre>
<h4>Measures</h4>
<p><span>Когда вы повторно используете раздел &#8220;Меры&#8221;, он включает в себя следующее</span>:</p>
<ul>
<li>Add measure</li>
</ul>
<p><span>Когда вы добавили меру, у вас появятся следующие свойства по умолчанию</span>:</p>
<ul>
<li>Label</li>
<li>Expression</li>
<li>Number formatting</li>
</ul>
<p class="example" data-mc-autonum="Example: " data-mc-conditions=""><strong><span class="autonumber">Пример: </span>Add Measures section</strong></p>
<p data-mc-conditions=""><span>В этом примере показано, как мы теперь добавили определение раздела «Меры» на панель свойств нашего расширения визуализации. </span><span>Обратите внимание, что здесь мы также определяем, что расширение визуализации должно иметь ровно одну меру.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">define( [], function ( ) {
    
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: {
                uses: "dimensions",
                min: 1,
                max: 1
            },
            measures: {
                uses: "measures",
                min: 1,
                max: 1
            }
        }
    };
 
});</pre>
<h4>Sorting</h4>
<p><span>Когда вы повторно используете раздел сортировки, он включает в себя следующее</span>:</p>
<ul>
<li>Labels of the dimension and measure<span>, используемые в расширении визуализации</span></li>
<li>Sorting option (Auto or Custom)<span>Опция Custom включает в себя следующее:</span>
<ul>
<li>Sort by expression (only available for dimensions)</li>
<li>Sort numerically</li>
<li>Sort alphabetically</li>
<li>Sort by frequency (only available for filter panes)</li>
</ul>
</li>
</ul>
<p class="example" data-mc-autonum="Example: " data-mc-conditions=""><strong><span class="autonumber">Пример: </span>Add Sorting section</strong></p>
<p data-mc-conditions=""><span>В этом примере показано, как мы теперь добавили определение раздела «Сортировка» на панель свойств вашего расширения визуализации. Мы не вносили никаких изменений в раздел «Сортировка», предварительно определенный </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">define( [], function ( ) {
    
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: {
                uses: "dimensions",
                min: 1,
                max: 1
            },
            measures: {
                uses: "measures",
                min: 1,
                max: 1
            },
            sorting: {
                uses: "sorting"
            }
        }
    };
 
});</pre>
<h4>Add-ons (Надстройки)</h4>
<p><span>Когда вы повторно используете раздел надстроек (Add-ons), он включает в себя следующее:</span></p>
<ul>
<li>Data handling</li>
<li>Reference lines</li>
</ul>
<p class="example" data-mc-autonum="Example: " data-mc-conditions=""><strong><span class="autonumber">Пример: </span>Add Add-ons section</strong></p>
<p data-mc-conditions=""><span>В этом примере показано, как мы добавляем определение раздела «Надстройки» на панель свойств вашего расширения визуализации. Мы не вносили никаких изменений в раздел «Надстройки», предварительно определенный </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [], function ( ) {
    
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: {
                uses: "dimensions",
                min: 1,
                max: 1
            },
            measures: {
                uses: "measures",
                min: 1,
                max: 1
            },
            sorting: {
                uses: "sorting"
            },
            addons: {
                uses: "addons"
            }
        }
    };
 
});</pre>
<h4>Appearance (<span class="syntax">settings</span>) &#8211; <span>Внешний вид</span></h4>
<blockquote><p><span>Appearance section называется </span><code><span class="syntax">settings</span></code><span> в коде.</span></p></blockquote>
<p><span>Когда вы повторно используете раздел «Внешний вид», он включает в себя следующее:</span></p>
<ul>
<li>General &#8211; <span>Общий</span><span>Включает настройки для заголовка, подзаголовка и сноски</span></li>
<li>Presentation &#8211; <span>Презентация</span> (<span>доступна только для визуализаций с более чем одним измерением</span>)</li>
<li>Colors and legend &#8211; <span>Цвета и легенда</span> (<span>доступно только в некоторых типах визуализаций</span>)</li>
<li>X-axis &#8211; <span>Ось X</span> (<span>доступна только в некоторых типах визуализаций</span>)</li>
<li>Y-axis &#8211; <span>Ось Y</span> (<span>доступна только в некоторых типах визуализаций</span>)</li>
</ul>
<p class="example" data-mc-autonum="Example: " data-mc-conditions=""><strong><span class="autonumber">Пример: </span>Add Appearance section</strong></p>
<p data-mc-conditions=""><span class="CommonComponentsQlik Sense"><span>В этом примере показано, как мы добавляем определение раздела «Внешний вид» на панель свойств вашего расширения визуализации. Мы не вносили никаких изменений в раздел «Надстройки», предварительно определенный </span><span>Qlik Sense</span><span>.</span></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [], function ( ) {
    
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: {
                uses: "dimensions",
                min: 1,
                max: 1
            },
            measures: {
                uses: "measures",
                min: 1,
                max: 1
            },
            sorting: {
                uses: "sorting"
            },
            addons: {
                uses: "addons"
            },
            settings: {
                uses: "settings"
            }
        }
    };
 
});</pre>
<h3><strong>Добавление дополнительных свойств (</strong><madcap:concept term="Building visualization extensions" xmlns:madcap="http://www.madcapsoftware.com/Schemas/MadCap.xsd">custom properties)</madcap:concept></h3>
<p><span>Вы можете задать <strong>custom properties</strong> для <strong>visualization extension</strong>. </span><span style="color: #339966;"><strong><span class="CommonComponentsQlik Sense">Qlik Sense</span></strong></span><span> автоматически добавляет их на панель свойств и заботится о сохранении. Затем вы найдете выбранные значения в параметре <code>layout</code>.</span></p>
<p><span>Для каждого свойства вы задаете объект JavaScript с разными полями в зависимости от того, какой тип настраиваемого свойства вы определяете.</span></p>
<p><span>Следующие компоненты пользовательского интерфейса могут использоваться для отображения ваших custom properties на панели свойств:</span></p>
<ul>
<li><strong>Button</strong> &#8211; Кнопка</li>
<li><strong>Button group</strong> &#8211; Группа кнопок</li>
<li><strong>Check box</strong> &#8211; Флажок</li>
<li><strong>Color-picker</strong> &#8211; выбор цвета</li>
<li><strong>Drop down list</strong> &#8211; Выпадающий список</li>
<li><strong>Input box / text box</strong> &#8211; <span><span>Поле ввода / текстовое поле</span></span></li>
<li><strong>Link</strong> &#8211; Ссылка</li>
<li><strong>Media</strong></li>
<li><strong>Radio button</strong> &#8211; Переключатель</li>
<li><strong>Range slider</strong> &#8211; Ползунок для выбора диапазона</li>
<li><strong>Slider</strong></li>
<li><strong>Switch</strong> &#8211; Переключатель</li>
<li><strong>Text</strong> &#8211; Текст</li>
<li><strong>Text area</strong> &#8211; Текстовая область</li>
</ul>
<p><span>Их можно сгруппировать в разделы и заголовки на панели свойств. </span><span>Каждый из них предоставляет различные параметры конфигурации для управления их поведением.</span></p>
<h4><strong>Совет: Как улучшить управляемость скриптом Javascript при разработке Extension?</strong></h4>
<p><span>Если у вас есть много разных свойств, определенных в основном файле JavaScript, вы скоро поймете, что размер файла js может стать довольно большим, и его будет трудно читать и поддерживать. Для облегчения работы с js есть разные подходы:</span></p>
<ul>
<li><span>Разделите раздел <code>definition</code> на несколько переменных JavaScript.</span></li>
<li><span>Создайте отдельный файл JavaScript для определения ваших свойств и загрузите этот файл в основной файл сценария расширения визуализации.</span></li>
</ul>
<h5><span>Определение свойств в отдельном файле JavaScript</span></h5>
<p><span>В этом разделе показано, как определить ваши свойства в отдельном файле JavaScript. </span><span>Мы начинаем со следующего кода, определенного в вашем основном файле сценария.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [
        'jquery'
    ],
    function ( $ ) {
        'use strict';

        return {

            // Define what the properties panel looks like
            definition: {
                type: "items",
                component: "accordion",
                items: {
                    dimensions: {
                        uses: "dimensions"
                    },
                    measures: {
                        uses: "measures"
                    },
                    appearance: {
                        uses: "settings",
                    }
                }
            },
            // Paint/Rendering logic
            paint: function ( $element, layout ) {
            // Main rendering logic goes here
            }
        };
    } );</pre>
<p><span>Создайте файл и назовите его <strong>properties.js</strong>. </span><span>Сохраните его в той же папке, где находятся ваши основные файлы расширения визуализации. </span><span>Новый файл <strong>properties.js</strong> должен выглядеть так:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [], function () {
    'use strict';
    // *****************************************************************************
    // Dimensions &amp; Measures
    // *****************************************************************************
    var dimensions = {
        uses: "dimensions",
        min: 0,
        max: 1
    };
    var measures = {
        uses: "measures",
        min: 0,
        max: 1
    };
    // *****************************************************************************
    // Appearance section
    // *****************************************************************************
    var appearanceSection = {
        uses: "settings"
    };
    // *****************************************************************************
    // Main properties panel definition
    // Only what is defined here is returned from properties.js
    // *****************************************************************************
    return {
        type: "items",
        component: "accordion",
        items: {
            dimensions: dimensions,
            measures: measures,
            appearance: appearanceSection
        }
    };
});</pre>
<p><span>Затем вам нужно загрузить внешнее определение свойств в ваш основной файл сценария и назначить <code>definition</code></span><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">define( [
        // Load properties.js using requireJS
        // Note: if you load .js files, omit the file extension
        // otherwise requireJS will not load it correctly
        './properties'
    ],
    function ( props ) {
        'use strict';
        return {
            definition: props,
            // Paint/Rendering logic
            paint: function ( $element, layout ) {
            // Main rendering logic goes here
            }
        };
    } );</pre>
<h4>Добавление basic custom property</h4>
<p><span>В этом разделе мы определим самый простой, но один из наиболее распространенных компонентов &#8211; текстовое поле.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Text box definition
var myTextBox = {
    ref: "props.myTextBox",
    label: "My text box",
    type: "string"
};</pre>
<p><span>В определении всех компонентов пользовательского интерфейса есть общие свойства, которые можно установить.</span></p>
<p><code><span class="syntax">type</span></code></p>
<p><span>Используется для всех определений типов настраиваемых свойств. Может быть </span><code><span class="API_syntax_input">string</span></code>,<span> </span><code><span class="API_syntax_input">integer</span></code>,<span> </span><code><span class="API_syntax_input">number</span></code><span> или</span><span> </span><code><span class="API_syntax_input">boolean</span></code>.</p>
<p><code><span class="syntax">ref</span></code></p>
<p><span>Имя или идентификатор, используемый для ссылки на свойство.</span></p>
<p><code><span class="syntax">label</span></code></p>
<p><span>Используется для определения метки, отображаемой на панели свойств.</span></p>
<p><code><span class="syntax">component</span></code></p>
<p><span>Используется для определения того, как свойство отображается на панели свойств.</span></p>
<div class="note"></div>
<blockquote><p><span>В приведенном выше примере <code><span class="syntax">component</span></code> </span><span>не определен. </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense </span></span><span>автоматически по умолчанию использует текстовое поле, если <code><span class="syntax">component</span></code> </span><span>не определен для элементов, <code><span class="syntax">type</span></code> </span><span class="syntax"><span>которых </span></span><span>является <code><span class="API_syntax_input">string</span></code> </span><span>или <code><span class="API_syntax_input">integer</span></code></span><span>.</span></p></blockquote>
<h4 id="anchor-3" tabindex="-1"><span>Добавление определения компонента на панель свойств</span></h4>
<p><span>В этом разделе мы добавим вновь созданное текстовое поле на основе строки в раздел Внешний вид.</span></p>
<p><strong>Перед:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Appearance section
var appearanceSection = {
    uses: "settings"
};
// Main properties panel definition
// Only what is defined here is returned from properties.js
return {
    type: "items",
    component: "accordion",
    items: {
        appearance: appearanceSection
    }
};</pre>
<p><strong>После:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var myTextBox = {
    ref: "props.myTextBox",
    label: "My text box",
    type: "string"
};

// Appearance section
var appearanceSection = {
    uses: "settings",
    items: {
        myTextBox: myTextBox
    }
};

// Main properties panel definition
// Only what is defined here is returned from properties.js
return {
    type: "items",
    component: "accordion",
    items: {
        appearance: appearanceSection
    }
};</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Adding_component_definition_to_properties_panel.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Adding_component_definition_to_properties_panel.png" alt="" width="230" height="208" class="aligncenter size-full wp-image-2592" /></a></p>
<h4 id="anchor-4" tabindex="-1"><span>Добавление собственного заголовка раздела</span></h4>
<p><span>В предыдущем примере вы добавили текстовое поле в новый раздел. В заголовке раздела автоматически повторно использовалась метка компонента. В этом разделе вы добавите собственный заголовок раздела. Для этого вы создаете новый заголовок ( </span><code><span class="syntax"><span>myNewHeader</span></span></code><span> в примере ниже) в существующем разделе «Внешний вид», а затем добавляете туда элементы:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var appearanceSection = {
    uses: "settings",
    items: {
        // Definition of the custom section header
        myNewHeader: {
            type: "items",
            label: "My header, containing text box",
            items: {
                myTextBox: myTextBox
            }
        }
    }
};

// NOTHING CHANGED HERE ...
// Return overall definition of the property accordion
return {
    type: "items",
    component: "accordion",
    items: {
        appearance: appearanceSection
    }
};</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Adding_component_definition_to_properties_panel_2.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/Adding_component_definition_to_properties_panel_2.png" alt="" width="230" height="205" class="aligncenter size-full wp-image-2593" /></a></p>
<h4 id="anchor-5" tabindex="-1"><span>Добавление настраиваемого раздела</span></h4>
<p><span>Вы также можете создавать совершенно новые разделы аккордеона.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">// Some components
var header1_item1 = {
    ref: "props.section1.item1",
    label: "Section 1 / Item 1",
    type: "string",
    expression: "optional"
};

...
...

// Define a custom section
myCustomSection = {
    // not necessary to define the type, component "expandable-items" will automatically
    // default to "items"
    // type: "items"
    component: "expandable-items",
    label: "My Accordion Section",
    items: {
        header1: {
            type: "items",
            label: "Header 1",
            items: {
                header1_item1: header1_item1,
                header1_item2: header1_item2
            }
        },
        header2: {
            type: "items",
            label: "Header 2",
            items: {
                header2_item1: header2_item1,
                header2_item2: header2_item2
            }
        }

    }
}</pre>
<p><span>Ключ в приведенном выше коде заключается в том, что вы добавляете <code>expandable-items</code></span><span> компонента . Остальной код работает как в предыдущих примерах.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">return {
    type: "items",
    component: "accordion",
    items: {
        appearance: appearanceSection,
        customSection: myCustomSection
    	 }
    };
});</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/qlik_sense_extension_development_tutorial_custom_section.png"><img loading="lazy" decoding="async" src="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/qlik_sense_extension_development_tutorial_custom_section.png" alt="" width="248" height="505" class="aligncenter size-full wp-image-2595" srcset="https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/qlik_sense_extension_development_tutorial_custom_section.png 248w, https://qliksense.ivan-shamaev.ru/wp-content/uploads/2021/02/qlik_sense_extension_development_tutorial_custom_section-147x300.png 147w" sizes="(max-width: 248px) 100vw, 248px" /></a></p>
<h3 id="anchor-6" tabindex="-1"><span>Отображение и сохранение custom (настраиваемых) свойств</span></h3>
<p><span>После того как вы определили </span><strong>custom properties</strong><span>, </span><span class="CommonComponentsQlik Sense"><span>Qlik Sense</span></span><span> позаботится обо всем остальном, а именно:</span></p>
<ul>
<li><span>Отображение <strong>custom properties</strong> вместе со встроенными свойствами</span></li>
<li><span>Сохранение значений свойств. Если значение свойства изменяется, вам не нужно заботиться о сохранении, то есть о сохранении и загрузке значения свойства.</span></li>
</ul>
<h3 id="anchor-7" tabindex="-1"><span>Ссылка на значения настраиваемых свойств</span></h3>
<p><span>Ссылка на значения <strong>custom properties</strong> аналогична ссылке на значения из встроенных свойств, но с одним исключением. Используя </span><code><span class="syntax"><span>ref</span></span></code><span>, вы можете определить, как значения свойств отображаются в дереве объектов. Этот принцип применяется ко всем элементам настраиваемых свойств.</span></p>
<p class="examples" data-mc-autonum="Examples: "><strong><span class="autonumber">Примеры:</span></strong></p>
<p data-mc-autonum="Examples: "><span>Определяем текстовое поле:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var myTextBox = {
    ref: "myTextBox",
    ...
};</pre>
<p data-mc-autonum="Examples: "><span>На это значение можно ссылаться в вашем скрипте:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">console.log( layout.myTextBox );</pre>
<p data-mc-autonum="Examples: "><span>В то время как:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">var myTextBox = {
    ref: "prop.myTextBox",
    ...
};</pre>
<p data-mc-autonum="Examples: "><span>Будет вызываться с использованием:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">console.log( layout.prop.myTextBox );</pre>
<blockquote>
<p data-mc-autonum="Examples: "><span>Добавление префиксов к вашим свойствам, как показано в последних примерах выше, позволяет легко перебирать все настраиваемые свойства. Это также гарантирует отсутствие конфликтов именования стандартных объектов </span><strong><span class="CommonComponentsQlik Sense">Qlik Sense</span></strong><span>.</span></p>
</blockquote>
<h2>Определение настраиваемых свойств</h2>
<h3>Custom string properties</h3>
<p>todo</p>
<h3>Custom integer properties</h3>
<p>todo</p>
<h3>Custom number properties</h3>
<p>todo</p>
<h3>Custom array properties</h3>
<p>todo</p>
<h3>Custom button properties</h3>
<p>todo</p>
<h3>Custom button group properties</h3>
<p>todo</p>
<h3>Custom check box properties</h3>
<p>todo</p>
<h3>Custom color-picker properties</h3>
<p>todo</p>
<h3>Custom drop down list properties</h3>
<p>todo</p>
<h3>Custom link properties</h3>
<p>todo</p>
<h3>Custom media properties</h3>
<p>todo</p>
<h3>Custom radio button properties</h3>
<p>todo</p>
<h3>Custom slider properties</h3>
<p>todo</p>
<h3>Custom range-slider properties</h3>
<p>todo</p>
<h3>Custom switch properties</h3>
<p>todo</p>
<h3>Custom text properties</h3>
<p>todo</p>
<h3>Custom textarea properties</h3>
<p>todo</p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/">Панель свойств расширения или Properties Panel</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/properties-panel-basics-qlik-extension/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
