정상적인 작동을 위해서는 각 데이터 작업이 다양한 메소드를 구현해야 하므로, 사용자는 변경할 동작을 구현하는 메소드를 무효화하기만 하면 됩니다.
일반 메소드
구체화된 데이터 작업 클래스(예: HTTPAPIDataAction
) 중 하나를 확장하는 경우 필요한 대부분의 메소드는 이미 구현된 상태이므로 사용자는 변경할 동작을 구현하는 메소드를 무효화하기만 하면 됩니다.
이 섹션에서는 다양한 메소드와 메소드가 수행해야 할 작업에 대해 설명합니다.
모든 유형의 데이터 작업은 여기에 기술된 메소드를 구현해야 합니다.
create(sID, sName)
create()
정적 메소드는 새 데이터 작업을 생성하는 동안 드롭다운 메뉴에서 데이터 작업 유형을 선택할 때 호출됩니다. 이 메소드는 다음을 처리해야 합니다.
Knockout 모델 클래스에는 ID와 이름이 있어야 합니다. 해당 ID와 이름은 기타 모든 속성에 대해 적합한 기본값과 함께 create()
메소드에 전달됩니다. 예를 들어, 통화 변환 데이터 작업의 경우 기본 통화가 달러로 변환되도록 설정할 수 있습니다. Knockout 모델은 올바른 기본값 제공 위치입니다.
invoke(oActionContext, oDataActionContext)
invoke()
메소드는 사용자가 시각화의 데이터 포인트에 대한 컨텍스트 메뉴에서 데이터 작업을 불러올 때 호출됩니다. 이 메소드는 선택된 데이터 포인트, 시각화, 필터, 워크북 및 세션을 기술하는 메타데이터가 포함된 DataActionContext
인수를 전달합니다. 데이터 작업 서비스 클래스을(를) 참조하십시오.
validate()
validate()
메소드는 사용자가 데이터 작업 대화상자에서 확인을 누를 때 각 데이터 작업에 대해 호출됩니다. validate()
메소드는 null
(모든 데이터 작업이 적합한 경우) 또는 DataActionError
(모든 데이터 작업이 부적합한 경우)를 반환합니다. 대화상자에서 데이터 작업 중 하나에 오류가 있을 경우 오류로 인해 대화상자가 닫히지 않고 사용자에게 오류 메시지가 표시됩니다. 이 메소드는 this.validateName()
메소드를 사용하여 데이터 작업의 이름을 검증합니다.
getGadgetInfos(oReport)
getGadgetInfos()
메소드는 사용자 인터페이스에 데이터 작업 속성 필드가 표시되도록 설정하기 위해 호출됩니다. 이 메소드는 사용자 인터페이스에 표시할 순서대로 GadgetInfos
의 배열을 반환합니다. 가장 일반적인 유형의 모든 필드(예: 텍스트, 드롭다운, 비밀번호, 다중 선택, 라디오 단추, 체크박스)에 대해 가젯이 제공되지만, 보다 복잡한 필드(예: 다중 가젯이 함께 그룹화되거나 선택된 옵션에 따라 다른 가젯 필드가 표시됨)가 필요한 경우 사용자정의 가젯을 생성할 수 있습니다. 잠재적 하위 클래스가 제공된 GadgetInfo
에서 보다 쉽게 가젯을 선택할 수 있도록 배열에서 원하는 각 GadgetInfo
를 구성할 메소드를 생성하는 것이 가장 좋습니다. 이 최적의 방법을 따를 경우 사용자 인터페이스에서 사용되는 각 필드에 대해 GadgetInfo
를 반환할 수 있는 다른 데이터 작업 기본 클래스로 구현된 다양한 메소드가 이미 있는 것입니다. 이러한 GadgetInfo
중 하나가 필요한 경우 해당하는 create****GadgetInfo()
메소드를 호출하고 가젯 배열에 반환 값을 푸시합니다.
isAllowedHere(oReport)
isAllowedHere()
메소드는 사용자가 시각화의 데이터 포인트를 마우스 오른쪽 단추로 눌러 사용자 인터페이스가 컨텍스트 메뉴 생성을 시작할 때 호출됩니다. 선택된 데이터 포인트와 관련된 데이터 작업이 존재하는 경우 이 메소드가 true
를 반환하며 컨텍스트 메뉴에 데이터 작업이 나타납니다. 메소드가 false
를 반환하는 경우 컨텍스트 메뉴에 데이터 작업이 나타나지 않습니다. 수퍼 클래스에서 상속된 기본 동작을 수락하는 것이 좋습니다.
upgrade(oOldDataActionJS)
첫번째 데이터 작업을 생성하려면 upgrade(oOldDataActionJS)
메소드를 사용하지 마십시오. 이 메소드는 첫번째 Knockout 모델을 생성했으며 Knockout 모델의 두번째 버전에 대한 속성을 크게 변경하려는 경우에만 사용하십시오. 예를 들어, 데이터 작업의 첫번째 버전이 Knockout 모델에 URL을 저장하지만 다음 버전이 별도 속성(예: protocol
, hostname
, port
, path
, queryString
및 bookmark
)에 URL 구성요소 부분을 저장하도록 결정할 수 있습니다.
Knockout 모델 코드의 두번째 버전이 Knockout 모델 코드의 첫번째 버전으로 저장된 데이터 작업을 열도록 요청합니다. 이로 인해 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 시스템에서는 현재 데이터 작업 코드 버전이 열려는 데이터 작업의 버전보다 최신인지 식별하고 새 데이터 작업 클래스에 대해 upgrade()
메소드를 호출한 후 이전 데이터 작업의 Knockout 모델(JSON 객체로 직렬화됨)을 전달합니다. 그러면 이전 JSON 객체를 사용하여 새 Knockout 모델을 채우고 JSON 객체의 업그레이드된 버전을 반환할 수 있습니다. 이를 통해 데이터 작업 코드가 향상되면서 이전 데이터 작업 메타데이터는 계속 작동합니다.
HTTPAPIDataAction 메소드
HTTPAPIDataAction
클래스를 확장하는 경우 무효화하도록 선택할 수 있는 다음 추가 메소드가 제공됩니다.
getAJAXOptions(oDataActionContext)
getAJAXOptions()
메소드는 데이터 작업의 invoke()
메소드로 호출됩니다. getAJAXOptions()
메소드는 데이터 작업이 생성할 HTTP 요청을 기술하는 AJAX Options
객체를 생성합니다. getAJAXOptions()
메소드에는 선택된 데이터 포인트, 시각화, 필터, 워크북 및 세션을 기술하는 메타데이터가 포함된 oDataActionContext
객체가 전달됩니다. 통합하려는 HTTP API에 필요한 AJAX Options
를 설정하고 HTTPRequest
가 성공하거나 실패하는 경우 호출되도록 할 함수를 지정합니다. jQuery.ajax
객체 및 해당 속성에 대한 설명은 JQuery 웹 사이트를 참조하십시오.
HTTPAPIDataAction
클래스에서 다음 구현이 상속됩니다. 요구사항을 지정하려면 상속된 메소드를 다시 작성해야 합니다. 예를 들어, HTTP 요청 및 HTTP 응답을 처리하는 코드를 구성합니다. 이 구현은 반환해야 할 객체인 getAJAXOptions()
함수에 전달된 매개변수를 표시하며 메소드 내 코드 구조화 방법의 명확한 예를 제공하므로 유용합니다.
1 /** 2 * This method returns an object containing the AJAX settings used when the data action is invoked. 3 * Subclasses may wish to override this method to provide their own behavior. 4 * @param {module:obitech-reportservices/dataactionmanager.DataActionContext} oDataActionContext The context metadata describing where the data action was invoked from. 5 * @returns {?object} A JQuery AJAX settings object (see http://api.jquery.com/jQuery.ajax/ for details) - returns null if there is a problem. 6 */ 7 dataaction.HTTPAPIDataAction.prototype.getAJAXOptions = function (oDataActionContext) 8 { 9 jsx.assertInstanceOfModule(oDataActionContext, "oDataActionContext", "obitech-reportservices/dataactionmanager", "DataActionContext"); 10 11 var oAJAXOptions = null; 12 var oKOViewModel = this.getKOViewModel(); 13 var sURL = oKOViewModel.sURL(); 14 if (sURL) 15 { 16 // Parse the URL 17 var sResultURL = this._parseURL(sURL, oDataActionContext); 18 if (sResultURL) 19 { 20 // Parse the POST parameters (if required) 21 var eHTTPMethod = oKOViewModel.eHTTPMethod()[0]; 22 var sData = null; 23 if (eHTTPMethod === dataaction.HTTPDataActionKOModel.HTTPMethod.POST) 24 { 25 var sPOSTParams = oKOViewModel.sPOSTParams(); 26 sData = sPOSTParams.replace(dataaction.AbstractHTTPDataAction.RegularExpressions.LINE_END, "&"); 27 sData = this._parseURL(sData, oDataActionContext, false); 28 } 29 oAJAXOptions = { 30 type: eHTTPMethod, 31 url: sResultURL, 32 async: true, 33 cache: false, 34 success: function (/*oData, sTextStatus, oJQXHR*/) 35 { 36 oDataActionContext.getReport().displaySuccessMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_SUCCESSFUL.format(oKOViewModel.sName())); 37 }, 38 error: function (oJQXHR/*, sTextStatus, sError*/) 39 { 40 oDataActionContext.getReport().displayErrorMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_FAILED.format(oKOViewModel.sName(), oJQXHR.statusText, oJQXHR.status)); 41 } 42 }; 43 if (sData) 44 { 45 oAJAXOptions.data = sData; 46 } 47 } 48 } 49 return oAJAXOptions; 50 };