Функции времени выполнения, доступные для настройки виджетов ThingWorx
В этом разделе описаны функции, доступные для виджетов во время выполнения.
Жизненный цикл виджета во время выполнения
• При первом создании виджета среда выполнения получает все объявленные свойства путем вызова функции runtimeProperties().
• Значения свойств, которые сохраняются в определении мэшапа, загружаются в объект без вызова какой-либо функции.
• После загрузки виджета, но перед его рендерингом на экране среда выполнения вызывает функцию renderHtml(). Эта функция возвращает HTML для объекта. Среда выполнения выполняет рендеринг фрагмента HTML, возвращенного этой функцией, в соответствующем месте в DOM.
• После добавления HTML в DOM вызывается функция afterRender(). При необходимости можно выполнить привязывание jQuery. На этом этапе можно ссылаться на фактические элементы DOM. Например, можно использовать следующий код для ссылки на элементы DOM:
// note that this is a jQuery object
var widgetElement = this.domElement;
|
Среда выполнения изменяет идентификатор вашего элемента DOM. Рекомендуется всегда использовать объект jQuery this.domElementId для получения идентификатора элемента DOM.
|
• Если определено событие, которое можно привязать, можно инициировать это событие, как показано в следующем примере:
var widgetElement = this.domElement;
// change ‘Clicked’ to be your event name
// you defined in your runtimeProperties
widgetElement.triggerHandler('Clicked');
• При наличии каких-либо свойств, привязанных как цели данных, вызывается функция updateProperty(). Если измененное свойство оказывает влияние на DOM, необходимо обновить непосредственно DOM. При привязке данных DOM в большинстве случаев изменяется.
• При наличии свойств, которые определены как источники данных и привязаны к ним, можно вызвать функцию getProperty_{propertyName}(). Если эта функция не определена, среда выполнения получает значение из контейнера свойств.
Интерфейсы API времени выполнения, доступные для виджетов
К следующим интерфейсам API можно получить доступ из виджета в контексте времени выполнения.
• this.jqElementId - ИД элемента DOM объекта, после рендеринга виджета на странице HTML.
• this.jqElement - это элемент jQuery.
• this.getProperty(name) - получает имя свойства.
• this.setProperty(name,value) - задает имя и значение свойства.
• this.updateSelection(propertyName,selectedRowIndices) - эта функция вызывается, если свойство изменяется в виджете в выбранных строках. К этим строкам привязаны данные. Например, в обратном вызове - если было определено событие, например onSelectStateChanged(), то вызовите интерфейс API this.updateSelection(propertyName,selectedRowIndices), и система обновит все виджеты, которые зависят от выбранных строк.
Обратные вызовы из среды выполнения в ваш виджет
Следующие функции виджета вызываются средой выполнения:
• runtimeProperties() [необязательно] - возвращает структуру JSON, определяющую свойства виджета.
Дополнительные свойства:
Свойство
|
Описание
|
isContainer
|
Указывает, может ли экземпляр виджета быть контейнером для других экземпляров виджетов. Допустимые значения: true и false. Значение по умолчанию свойства: fasle.
|
needsDataLoadingAndError
|
Допустимые значения: true и false. Значение по умолчанию свойства: fasle. Задайте для свойства значение true, если требуется, чтобы отображение в виджете имело стандартную непрозрачность 25 % при отсутствии данных. Виджет становится красным, если возникает ошибка при загрузке данных.
|
borderWidth
|
Если виджет имеет границу, задайте в этом свойстве значение ширины границы. Это свойство помогает обеспечить точную до пикселя конструкцию во время разработки и во время выполнения.
|
supportsAutoResize
|
Указывает, будет ли виджет автоматически поддерживать изменение размеров. Допустимые значения: true и false.
|
propertyAttributes
|
При наличии свойств типа STRING, доступных для локализации, перечислите их в этом свойстве.
Например, TooltipLabel1 доступно для локализации:
this.runtimeProperties = function () { return { 'needsDataLoadingAndError': true, 'propertyAttributes': { 'TooltipLabel1': {'isLocalizable': true} } } };
|
• renderHtml() [требуется] - функция возвращает фрагмент HTML, который среда выполнения помещает на экран. Для контейнера содержимого виджета, например, divдолжен быть указан класс виджета-содержимого. После задания класса элемент контейнера добавляется в DOM. Контейнер доступен, если используется jqElement, а его идентификатор элемента DOM доступен в jqElementId.
• afterRender() [необязательно] - эта функция вызывается после вставки фрагмента HTML виджета в DOM. Используйте this.domElementId, чтобы получить ИД элемента DOM. Используйте элемент this.jqElement, чтобы получить элемент DOM jQuery.
• beforeDestroy() [необязательно, но настоятельно рекомендуется] - вызывайте эту функцию, когда виджет удаляется с экрана. С помощью этой функции можно выполнять следующие действия:
◦ Отменить привязку всех привязок.
◦ Очистить любой набор данных, используя .data().
◦ Удалите все сторонние библиотеки или подключаемые модули, вызовите их деструкторы и т. д.
◦ Освободите какую-либо память, которая была выделена или содержится в замыканиях, задав для всех переменных значение null
◦ Не нужно уничтожать элементы DOM в виджете, они уничтожаются во время выполнения
◦ Удаляйте DOM только путем добавления аргумента DOMOnly в функцию.
|
Чтобы использовать отложенную загрузку с виджетом, добавьте аргумент DOMOnly в функцию.
|
• resize(width,height) [необязательно - применяется, только если объявить supportsAutoResize = true] - эта функция вызывается при изменении размера виджета.
Для некоторых виджетов такая обработка не нужна. Например, если элементы виджета и CSS автоматически масштабируются.
Однако для большинства виджетов требуется специальная обработка при изменении размеров виджета.
• handleSelectionUpdate(propertyName, selectedRows, selectedRowIndices) - эта функция вызывается при изменении выбранных строк источниками данных, привязанными к ним с помощью указанного свойства. selectedRows - массив фактических данных, а selectedRowIndices - массив индексов выбранных строк.
|
Необходимо определить эту функциональность, чтобы получить полную функциональность события selectedRows без необходимости привязки виджета списка или сетки.
|
• serviceInvoked(serviceName) - функция вызывается при инициировании определенного ранее сервиса.
• updateProperty(updatePropertyInfo) - updatePropertyInfo представляет собой объект со следующей структурой JSON:
{
DataShape: metadata for the rows returned
ActualDataRows: actual Data Rows
SourceProperty: SourceProperty
TargetProperty: TargetProperty
RawSinglePropertyValue: value of SourceProperty
in the first row of ActualDataRows
SinglePropertyValue: value of SourceProperty
in the first row of ActualDataRows
converted to the defined baseType of the
target property [not implemented yet],
SelectedRowIndices: an array of selected row indices
IsBoundToSelectedRows: a Boolean letting you know if this
is bound to SelectedRows
}
Для каждой привязки данных при каждом изменении исходных данных в виджете вызывается объект updateProperty(). Необходимо установить флажок для updatePropertyInfo.TargetProperty, чтобы определить, какой аспект виджета должен обновляться.
См. следующий пример для виджета:
this.updateProperty = function (updatePropertyInfo) {
// get the img inside our widget in the DOM
var widgetElement = this.jqElement.find('img');
// if we're bound to a field in selected rows
// and there are no selected rows, we'd overwrite the
// default value if we didn't check here
if (updatePropertyInfo.RawSinglePropertyValue !==
undefined) {
// see which TargetProperty is updated
if (updatePropertyInfo.TargetProperty === 'sourceurl') {
// SourceUrl updated - update the <img src=
this.setProperty('sourceurl',
updatePropertyInfo.SinglePropertyValue);
widgetElement.attr("src",
updatePropertyInfo.SinglePropertyValue);
} else if (updatePropertyInfo.TargetProperty ===
'alternatetext') {
// AlternateText updated - update the <img alt=
this.setProperty('alternatetext',
updatePropertyInfo.SinglePropertyValue);
widgetElement.attr("alt",
updatePropertyInfo.SinglePropertyValue);
}
}
};
Задайте локальную копию свойства в объекте виджета. Это обеспечивает для системы времени выполнения возможность получения этого свойства из контейнера свойств.
Кроме того, можно определить пользовательский метод getProperty_{propertyName} и сохранить значение каким-либо другим способом.
• getProperty_{propertyName}() - если во время выполнения требуется значение свойства, эта функция проверяет, реализована ли в виджете функция для переопределения и получения значения этого свойства. Используется, если среда выполнения получает данные из виджета, чтобы заполнить параметры для вызова сервиса.