ThingWorx 위젯을 사용자 정의하는 데 사용할 수 있는 런타임 함수
이 단원에서는 런타임 시 위젯에 사용할 수 있는 함수를 설명합니다.
런타임 시 위젯 수명 주기
• 위젯을 처음 만들 때 런타임은 runtimeProperties() 함수를 호출하여 선언된 모든 속성을 가져옵니다.
• 매쉬업 정의에 저장된 속성 값은 함수를 호출하지 않고 객체에 로드됩니다.
• 위젯이 로드된 후 화면에 렌더링되기 전에 런타임은 renderHtml() 함수를 호출합니다. 이 함수에서 객체에 대한 HTML을 반환합니다. 런타임은 함수에 의해 반환된 HTML을 DOM의 적절한 위치에서 렌더링합니다.
• DOM에 HTML이 추가된 후 afterRender() 함수가 호출됩니다. 필요한 경우 jQuery 바인딩을 수행할 수 있습니다. 이 시점에서 실제 DOM 요소를 참조할 수 있습니다. 예를 들어, 다음 코드를 사용하여 DOM 요소를 참조합니다.
// note that this is a jQuery object
var widgetElement = this.domElement;
|
런타임은 DOM 요소의 ID를 변경합니다. 항상 jQuery 객체 this.domElementId를 사용하여 DOM 요소의 ID를 가져오는 것이 좋습니다.
|
• 바인딩할 수 있는 이벤트를 정의한 경우 다음 예와 같이 이벤트를 트리거할 수 있습니다.
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 - HTML 페이지에서 위젯을 렌더링한 후 객체의 DOM 요소 ID입니다.
• 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입니다. 받은 데이터가 없을 때 위젯에서 표준 25%의 불투명도를 표시하려면 속성을 true로 설정합니다. 데이터를 읽어들이는 동안 오류가 발생하면 위젯이 빨간색으로 바뀝니다.
|
borderWidth
|
위젯에 테두리가 있는 경우 이 속성을 테두리 너비로 설정합니다. 이 속성은 개발 및 런타임 중에 픽셀이 완벽한 설계를 보장하는 데 도움이 됩니다.
|
supportsAutoResize
|
위젯이 크기 조정을 자동으로 지원하는지 지정합니다. 유효한 값은 true 및 false입니다.
|
propertyAttributes
|
지역화할 수 있는 STRING 속성이 있으면 이 속성에 나열합니다.
예를 들어, TooltipLabel1을 지역화할 수 있는 경우 다음과 같습니다.
this.runtimeProperties = function () { return { 'needsDataLoadingAndError': true, 'propertyAttributes': { 'TooltipLabel1': {'isLocalizable': true} } } };
|
• renderHtml() [필수 항목] - 이 함수는 런타임이 화면에 배치하는 HTML 조각을 반환합니다. 예를 들어, 위젯의 콘텐츠 컨테이너 div에는 위젯 콘텐츠 클래스가 지정되어 있어야 합니다. 클래스가 지정된 후 컨테이너 요소가 DOM에 추가됩니다. 컨테이너는 jqElement를 사용하여 액세스할 수 있으며 해당 DOM 요소 ID는 jqElementId에서 사용할 수 있습니다.
• afterRender() [선택 항목] - 위젯 HTML 조각이 DOM에 삽입된 후 이 함수가 호출됩니다. this.domElementId를 사용하여 DOM 요소 ID를 가져옵니다. this.jqElement 요소를 사용하여 jQuery DOM 요소를 가져옵니다.
• beforeDestroy() [옵션 항목이지만 매우 권장] - 위젯을 화면에서 제거할 때 이 함수를 호출합니다. 이 함수를 사용하여 다음을 수행할 수 있습니다.
◦ 바인딩의 바인딩 해제
◦ .data()를 사용하여 데이터 집합 지우기
◦ 타사 라이브러리 또는 플러그인을 제거하고 해당 소멸자를 호출합니다.
◦ 모든 변수를 null로 설정하여 할당했거나 클로저에서 보유 중인 모든 메모리를 확보합니다.
◦ 위젯 내에서 DOM 요소를 제거할 필요는 없습니다. 이러한 요소는 런타임에 의해 제거됩니다.
◦ 함수에 DOMOnly 인수를 추가하여 DOM만 제거합니다.
|
위젯에 지연 로드를 사용하려면 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}() - 런타임에 속성 값이 필요하면 위젯이 해당 속성의 값으로 재정의하고 가져오는 함수를 구현하는지 확인합니다. 이는 런타임이 위젯의 데이터를 가져와 서비스 호출을 위한 매개 변수를 채울 때 사용됩니다.