出典:ArcGIS Experience Builder - Guide - Message and action
メッセージ/アクションは、ウィジェットからウィジェット、ウィジェットからフレームワーク、フレームワークからウィジェットへの通信をサポートする方法です。
ウィジェット/フレームワークはメッセージを公開したり、メッセージを聞いたりすることができます。メッセージは jimu フレームワークによって定義される MessageType
によって識別されます。jimu には ExtentChange
や DataRecordsSelectionChange
のようないくつかのメッセージタイプが定義されています。
ウィジェットは,MessageManager.getInstance().publishMessage(message)
を呼び出してメッセージを発行します.例えば、List
ウィジェットでは,リストアイテムがクリックされたときに DataRecordsSelectionChange
メッセージを発行したり,Map
ウィジェットでは,ビューが変更されたときに ExtentChange
メッセージを発行して,List
ウィジェットのコンテンツを更新したりします。以下の MessageTypes
がサポートされています。
StringSelectionChange
ExtentChange
DataRecordsSelectionChange
DataRecordSetChange
各メッセージには、それを定義するクラスがあります。例えば、ExtentChange
メッセージは ExtentChangeMessage
クラスで定義され、このクラスはメッセージのペイロードである extent
プロパティを定義します。
メッセージを公開するために、ウィジェットは manifest.json
ファイルで公開メッセージを宣言する必要があります。
"publishMessages": [
"DATA_RECORDS_SELECTION_CHANGE"
]
メッセージアクションを作成するには、AbstractMessageAction
クラスを継承する必要があります。メッセージアクションの開発に役立つメソッドや関数がいくつかあります。
filterMessageType
メソッドは、利用可能なアクションのフィルタリングに使用されます。
export default class QueryAction extends AbstractMessageAction{
filterMessageType(messageType: MessageType, messageWidgetId?: string): boolean{
return [MessageType.StringSelectionChange, MessageType.DataRecordsSelectionChange].indexOf(messageType) > -1;
}
}
filterMessage
メソッドは、メッセージマネージャでメッセージをフィルタリングするために使用されます。
filterMessage(message: Message): boolean{
return true;
}
getSettingComponentUri
コンポーネントを使って、メッセージに基づいてアクションを設定することができます。
getSettingComponentUri(messageType: MessageType, messageWidgetId?: string): string {
return 'actions/query-action-setting';
}
onExecute
メソッドは、メッセージタイプに応じて発生させたいロジックを処理します。以下のスニペットでは、基本的にメッセージタイプに基づいてアクションを選択し、dispatch
プロパティを使用してアプリケーションから getAppStore()
関数を使用してストアに送信しています。これにより、redux アクションがディスパッチされ、ステートが更新されるようになります。Redux アクションと Redux でのストアの使用について詳しくはこちらをご覧ください。
onExecute(message: Message, actionConfig?: any): Promise<boolean> | boolean{
let q = `${(actionConfig as ConfigForStringChangeMessage).fieldName} = '${message}'`
switch(message.type){
case MessageType.StringSelectionChange:
q = `${(actionConfig as ConfigForStringChangeMessage).fieldName} = '${(message as StringSelectionChangeMessage).str}'`
break;
case MessageType.DataRecordsSelectionChange:
q = `${actionConfig.fieldName} = ` +
`'${(message as DataRecordsSelectionChangeMessage).records[0].getFieldValue(actionConfig.fieldName)}'`
break;
}
getAppStore().dispatch(appActions.widgetStatePropChange(this.widgetId, 'queryString', q));
return true;
}
manifest.json
には messageActions
プロパティがあり、メッセージ アクション エクステンションの場所と情報を提供します。
"messageActions": [
{
"name": "query",
"label": "Query",
"uri": "actions/query-action",
"settingUri": "actions/query-action-setting"
}
]
メッセージアクションの言語サポートは、ウィジェットと同じパターンですが、1つ重要な違いがあります。メッセージアクションには、ユーザーがアクションを選択するための Select an action
パネルがあります。そのため、アクションのプロパティ名を記載した default.ts
というファイルを runtime/translations フォルダに用意する必要があります。フレームワークは、このパネルのアクションラベルの翻訳を処理します。そのため、ラベルのプロパティは、_action_<actionName>_label
という命名規則を持つ必要があります。
export default {
_widgetLabel: 'Message subscriber',
_action_query_label: 'Query'
}