トリガとリアクタ

各動的ルール リアクタは、変更によってトリガされます。変更には、作成、修正、削除の 3 種類があります。動的ルールを作成するとデザイン内の非動的ルールが修正されることがあるため、作成と修正を区別できずに、同じリアクタで処理されます。

Intent のシーンでは、多くの目的で、動的ルールを使用しますが、これらのすべてがリアクタの処理対象になるわけではありません。リアクタは、特定の状況でのみトリガされます。たとえば、Part.CreateDynamicRule API を使用してルールを作成すると、リアクタがトリガされますが、同じルールを除去(削除)する元に戻す操作ではトリガされません。元に戻す操作およびやり直し操作では、リアクタはトリガされません。リアクタのトリガが省略される状況は、他にもいくつかあります。

動的ルールを変更すると、Intent によってリアクタを起動する必要があるかどうかを確認するチェックが行われます。必要がある場合は、名前一致プロセスを使用して、リアクタが検索されます。基本的なルールの名前は、ルール名、アンダースコア、トリガ名の順で構成されています。子ルールの名前はトリガ名だけで、パーツ上に存在する必要があります。さらに、各トリガには、対応する "許可" 名があり、この名前は変更を防止するために使用されます。一致する名前が見つからなかった場合は、それ以上のアクションは実行されません。

一致する "許可" 名が見つかった場合は、その名前が評価され、変更を続行するかどうかが判定されます。見つからなかった場合の既定の動作では、変更が許可されます。許可メソッドは、常にブーリアン演算を返し、アクション一覧は返しません。許可される場合は、対応するリアクタ メソッドが存在するかどうかが評価されます。

許可以外のすべてのリアクタは、"アクション一覧" を返します。この一覧はアクションの一覧として構成され、各アクションは名前と値のペアのプロパティ一覧("plist")です。許可される名前は、実際のリアクタ タイプの関数ですが、常に CreateDynamicRule、DeleteDynamicRule、CreateDynamicPart のいずれか 1 つが続く :action が含まれている必要があります。動的パーツの削除は、DeleteDynamicRule によって実行されます。一覧には、任意の数のアクションが含まれるため、1 つのルールを変更すると、任意の数のその他の変更が行われる可能性があります。

アクション一覧は、取得された後で処理されます。アクションの影響を受けるルール自体が、リアクタの対象になる可能性があることに注意してください。これにより、変更が再帰的に繰り返される可能性があり、リアクタの起動に関する問題のほとんどは、この潜在的な複雑さに起因します。リアクタの処理は、Intent 外部の単独の評価内で行われるのではなく、動的ルール コンパイルのツリー内で行われます。このツリーは深くなる可能性があり、その結果、開発者はほとんどデバッグすることができません。

基本的なルールのトリガ

ルール 起動タイミング 戻り値
<ルール名>_allowModify? <ルール名> の修正前に起動されます。 修正を許可するかどうかを示すブーリアン演算です。
<ルール名>_preModify <ルール名> の修正前に起動されます。 実行するアクションのセットが記述されている一覧です。
<ルール名>_postModify <ルール名> の修正後に起動されます。 実行するアクションのセットが記述されている一覧です。
<ルール名>_allowDelete? <ルール名> の削除前に起動されます。 削除を許可するかどうかを示すブーリアン演算です。
<ルール名>_preDelete <ルール名> の削除前に起動されます。<ルール名> が子ルールである場合は、いずれかの deleteSelf トリガの前に起動されます。 実行するアクションのセットが記述されている一覧です。リアクタは、ルールを参照することができます。
<ルール名>_postDelete <ルール名> の削除後に起動されます。<ルール名> が子ルールであった場合は、いずれかの deleteSelf トリガの後に起動されます。 実行するアクションのセットが記述されている一覧です。リアクタは、デザイン ルールをシャドウしていない限り、ルールを参照することはできません。

子ルールのトリガ

次のトリガとそのリアクタは、動的パーツが追加および削除されるタイミングの通知に使用されます。これらのリアクタは、通常は、追加または削除されているパーツのデザインの中で "デザイン ルール" (非動的)としてコード化されます。

ルール 起動タイミング 戻り値
preCreateSelf パーツの作成直後に起動されます。 実行するアクションのセットが記述されている一覧です。
postCreateSelf preCreateSelf ステップ後に起動されます。 実行するアクションのセットが記述されている一覧です。
allowDeleteSelf 削除前に起動されます。 削除を続行できるかどうかを示すブーリアン演算です。
preDeleteSelf 削除前、および配下の任意の動的ルールの削除前に起動されます。 実行するアクションのセットが記述されている一覧です。
postDeleteSelf 配下のすべての動的ルールを削除後だが、パーツ自体の削除直前に起動されます。 実行するアクションのセットが記述されている一覧です。

アクション

"アクション" は、自動化された動的ルールの作成または削除手順です。これらが、サポートされている唯一のアクションです。

各アクションは、"plist 形式" (名前と値の変更)の一覧として指定されます。1 番目の名前は、常に :Action であり、次のいずれかが続きます。
  • CreateDynamicRule: 任意のパーツに、任意の名前、任意の形式を使用して、すべてのタイプのルールを作成します。必須フィールドは、パーツ(新しいルールの親(所有者)を指定します)、名前(新しいルールの名前であり、Intent の Name である必要があります)、(新しいルールの式)です。式は、数値のような単純な定数の場合でも、文字列にする必要があります。
  • CreateDynamicPart: 子ルールを作成します。必須フィールドは、パーツ(新しいルールの親(所有者)を指定します)、名前(新しいルールの名前であり、Intent の Name である必要があります)です。これらの必須フィールドの後に、'デザイン' 疑似パラメータなどの、新しい子ルールのパラメータと式を続けます。パラメータは、Name にする必要があります。ただし、式は文字列にします。
  • DeleteDynamicRule: 任意の動的ルール(動的な "修正" ルール)を削除します。必須フィールドは、パーツ(削除するルールの親(所有者)を指定します)、名前(削除するルールの名前)です。削除されたルールが子ルールである場合は、配下のすべての動的ルールと修正ルールも削除され、関連するすべてのイベント リアクタが再帰的に起動されます。

アクション一覧は、トリガ時に作成されます。通常は、ルールを使用してアクション一覧を構築し、Intent モデルのフィーチャのほとんどを使用することができます。主な制限事項は、アクションが処理されるときの、Intent の状態の性質によるものです。初回トリガは、ある種の動的ルール修正であり、Intent はそのルールの修正処理中です。変更は再帰的に行われる可能性があるため、非常に複雑な状態になり、開発者が変更の対象となるさまざまな動的ルールの有無を具体的に把握することは困難です。

"評価" アクションはなく、何も必要ありません。リアクタのパーツとしてルールを評価する場合は、そのまま評価します。返されるアクション一覧に反映する必要はありません。

重要な注意事項

リアクタは Intent の評価機能を使用するため、評価中にリアクタをトリガすることはできません。つまり、リアクタをトリガする動的ルールを変更する目的で、ルール内部から Intent API を呼び出すことはできません。例外が発生し、評価機能の再入力が試行されたことが通知されます。主にこの理由により、リアクタは API 呼び出しによってトリガされる必要があり、通常は UI アクションに対する応答としてトリガされます。

アクションは、すべての関連リアクタを再帰的にトリガします。この動作を回避する方法はありません。

アクション一覧内のすべてのアクションが同時に処理されます。アクション一覧の後続のアクションで、アクション一覧の先行するアクションの結果にアクセスすることはできません。

アクション一覧のすべてのアクションは、元のトリガと同じ元に戻すグループ内で実行されます。これには、カスケーディング イベントによって起動されるすべてのアクションも含まれます。つまり、ユーザが元の操作を "元に戻した" 場合は、モデルを元の状態に戻すために、リアクタがコントロールするすべての変更も元に戻されます。リアクタは、元に戻す操作またはやり直す動作の一部として操作が行われた場合には、トリガされません。