選擇要覆寫的資料動作繼承方法

每個資料動作都必須實行各種不同的方法才能正常運作,因此您只需要覆寫這些實行您要變更之行為的方法。

一般方法

假設延伸其中一個具體資料動作類別,例如 HTTPAPIDataAction,其中大多數的必要方法都已經實行,因此您只需要覆寫實行想要變更之行為的方法。

本節描述各種方法及其預期的功能。

所有類型的資料動作必須實行此處描述的方法。

create(sID, sName)

當您建立的是新資料動作,並從下拉式功能表中選取資料動作類型時,會呼叫 create() 靜態方法。此方法負責下列作業:

  • 建構您的資料動作使用的「剔除模型」類別。

    「剔除模型」類別必須具有與所有其他特性的合理預設值一同傳送給 create() 方法的 ID 和名稱。例如,針對幣別轉換資料動作,您可能想要設定要轉換為「美元」的預設幣別。「剔除模型」是可提供您預設值的正確位置。

  • 從「剔除模型」建構資料動作的執行處理。
  • 傳回資料動作的執行處理。

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) 方法。只有在您已建立第一個「剔除模型」之後,且正在對第二版「剔除模型」的特性進行大幅變更時,才使用此模型。例如,如果第一版的資料動作將 URL 儲存在其「剔除模型」中,但您決定下一版會將 URL 元件部分儲存在個別的特性中 (例如 protocolhostnameportpathqueryStringbookmark)。

第二版「剔除模型」程式碼會要求開啟已與第一版「剔除模型」程式碼一起儲存的資料動作,這會造成問題。為了解決此問題,系統會識別目前的資料動作程式碼版本比正在開啟的資料動作版本還要新,並對新資料動作類別呼叫 upgrade() 方法,然後在舊的資料動作「剔除模型」中傳送 (序列化至 JSON 物件)。接著您可以使用舊 JSON 物件來填入新的「剔除模型」,並傳回升級版本的 JSON 物件。這可確保當您改善資料動作程式碼時,舊資料動作中繼資料會繼續運作。

HTTPAPIDataAction 方法

延伸 HTTPAPIDataAction 類別時,它會提供下列的其他方法供您選擇覆寫:

getAJAXOptions(oDataActionContext)

getAJAXOptions() 方法由資料動作的 invoke() 方法呼叫。getAJAXOptions() 方法會建立 AJAX Options 物件,此物件描述您要資料動作提出的 HTTP 要求。oDataActionContext 物件會傳送給 getAJAXOptions() 方法,該物件包含描述所選資料點、視覺化、篩選、工作簿及階段作業的中繼資料。依據您嘗試整合的 HTTP API 要求設定 AJAX Options,並指定當 HTTPRequest 成功或產生錯誤時所要呼叫的函數。請參閱 JQuery 網站以取得 jQuery.ajax 物件及其特性的說明。

下列實行繼承自 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 };