オーバーライドするデータ・アクション継承メソッドの選択
各データ・アクションを適切に機能させるには様々なメソッドを実装する必要があるため、変更する動作を実装するメソッドのみをオーバーライドする必要があります。
汎用メソッド
HTTPAPIDataActionなどの具象データ・アクション・クラスの1つを拡張する場合、必要なメソッドのほとんどはすでに実装されており、変更する動作を実装するメソッドのみをオーバーライドする必要があります。
この項では、様々なメソッドとその想定について説明します。
すべてのタイプのデータ・アクションは、ここで説明するメソッドを実装する必要があります。
create(sID, sName)
create()の静的メソッドは、新しいデータ・アクションを作成して、ドロップダウン・メニューから「データ・アクション・タイプ」を選択する場合にコールされます。 このメソッドの役割は次のとおりです:
- データ・アクションで使用されるKnockoutモデル・クラスを構築します。
Knockoutモデル・クラスには、
create()メソッドに渡されるIDと名前、および他のすべてのプロパティに対する一貫したデフォルト値が必要です。 たとえば、通貨換算データ・アクションの場合、デフォルト通貨をドルに換算するように設定できます。 Knockoutモデルは、デフォルト値を提供するための正しい場所です。 - ノック・アウト・モデルからデータ・アクションのインスタンスを構築します。
- データ・アクションのインスタンスを戻します。
invoke(oActionContext, oDataActionContext)
ユーザーがビジュアライゼーションにおいてデータ・ポイントのコンテキスト・メニューからデータ・アクションを起動すると、invoke()メソッドがコールされます。 このメソッドは、選択したデータ・ポイント、ビジュアライゼーション、フィルタ、ワークブックおよびセッションを記述するメタデータを含むDataActionContext引数を渡します。 「データ・アクション・サービス・クラス」を参照してください。
validate()
ユーザーが「データ・アクション」ダイアログでOKをクリックすると、各データ・アクションで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 Modelを作成し、2番目のバージョンのKnockout Modelのプロパティに大きく変更した場合にのみ使用してください。 たとえば、最初のバージョンのデータ・アクションで、URLがKnockout Modelに格納されている場合に、次のバージョンでURLコンポーネント・パーツが別のプロパティ(protocol、hostname、port、path、queryStringおよびbookmark)に格納されるように決定します。
Knockoutモデル・コードの2番目のバージョンは、問題を引き起こす可能性のあるKnockoutモデル・コードの最初のバージョンで保存されていたデータ・アクションを開くようにリクエストします。 この問題を解決するために、現在のデータ処理コード・バージョンがオープンされているデータ・アクションのバージョンよりも新しいことが識別され、これが新しいデータ・アクション・クラスでupgrade()メソッドを呼び出し、古いデータ・アクションKnockout Model (JSONオブジェクトに直列化)を渡します。 その後、古いJSONオブジェクトを使用して新しいKnockoutモデルを移入し、アップグレードしたバージョンのJSONオブジェクトを返すことができます。 これにより、データ・アクション・コードを改善しても、古いデータ・アクション・メタデータが引き続き機能するようになります。
HTTPAPIDataActionメソッド
HTTPAPIDataActionクラスを拡張する場合、オーバーライドする可能性のある次の追加のメソッドが提供されます:
getAJAXOptions(oDataActionContext)
getAJAXOptions()メソッドは、データ・アクションのinvoke()メソッドによりコールされます。 getAJAXOptions()メソッドでは、データ・アクションで実行するHTTPリクエストを記述したAJAX Optionsオブジェクトが作成されます。 getAJAXOptions()メソッドは、選択したデータ・ポイント、ビジュアライゼーション、フィルタ、ワークブックおよびセッションを記述するメタデータを含むoDataActionContextオブジェクトを渡します。 統合しようとしているHTTP APIで必要に応じてAJAX Optionsを設定し、HTTPRequestが成功した場合、またはエラーが発生した場合にコールする関数を指定します。 jQuery.ajaxオブジェクトとそのプロパティの説明は、JQueryのwebサイトを参照してください。
次の実装は、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 };