イベント

アプリの UI またはクライアント サイドのスクリプトがデータへのアクセスや変更を行うたびに、サーバー上でイベントが発生します。サーバーサイドのスクリプトでイベントはトリガーされません。レコードの読み込みまたは保存時でもイベントは発生しません。これらはデータイベントであり、ウィジェット イベントではありません。

イベントが発生すると、権限が確認されます。また、サーバーサイドのスクリプトが実行される場合もあります。

複数のレコードに対してリクエストや変更が行われた場合、影響を受けるレコードごとに 1 つのイベントがトリガーされます。たとえば、onAfterLoad イベントは、クライアントに返されたレコードごとにトリガーされます。

イベントタイプ

名前 説明
onAfterLoad サーバーがレコードを返す前に発生するイベント。
onBeforeCreate クライアントがレコードを作成してから、レコードがデータベースに保存されるまでに発生するイベント。
onAfterCreate クライアントがレコードを作成してサーバーがそのレコードをデータベースに保存してから、クライアントが変更を読み込むまでに発生するイベント。
onBeforeSave クライアントがレコードに変更を適用してから、レコードがデータベースに保存されるまでに発生するイベント。
onAfterSave クライアントが変更を行い、サーバーがその変更をデータベースに保存してから、クライアントが変更を読み込むまでに発生するイベント。
onBeforeDelete クライアントがレコードの削除をリクエストしてから、レコードがデータベースから削除されるまでに発生するイベント。
onAfterDelete クライアントがデータベースからのレコードの削除をサーバーにリクエストしてから、クライアントが削除結果を読み込むまでに発生するイベント。

イベントと例外

イベントが発生すると、App Maker は関連するモデルとリレーションの権限を確認します。イベントのスクリプトがある場合は、そのスクリプトを実行します。権限の確認に失敗した場合やスクリプトが例外を返した場合、App Maker はイベントをキャンセルし、クライアントにエラーを返します。onAfterLoad イベントがキャンセルされた場合、サーバーからレコードが返されません。他のイベントがキャンセルされた場合、データベースへの変更は行われません。

イベント スクリプト

イベント スクリプトは、モデルエディタの [Events] タブで追加します。イベント スクリプトは、イベントをトリガーしたレコードを表す record 変数にアクセスできます。

クエリの実行やレコードの保存など、負荷の高いオペレーションを呼び出す場合は注意してください。多くのクライアント アクションは一度に複数のレコードを操作するため、スクリプトが複数回実行される可能性があります。コードのパフォーマンスを向上させるため、キャッシュの使用を検討してください。

以下では、いくつかのイベントタイプについて、イベント スクリプトの使用例を紹介します。

onAfterLoad の例

onAfterLoad イベントを使用すると、レコードにアクセスしたユーザーを追跡できます。次の例は、レコードを最後に閲覧した人物を追跡します。

var userEmail = Session.getActiveUser().getEmail();
record.LastVisitor = userEmail;
app.saveRecords([record]);

onBeforeCreate の例

onBeforeCreate イベントを使用すると、サーバーで計算された値を使用してレコードを初期化できます。次の例は、新しいレコードを作成日で初期化します。

 record.TimeCreated = new Date();

onAfterCreate の例

onAfterCreate イベントを使用すると、新しいレコードがデータベースに保存された後にアクションを実行できます。次の例では、新しいレコードの詳細を含むメールを送信します。

var body = 'record: { key:' + record._key + ',name:' + record.name + '}';
console.log('record key is ' + record._key);
sendEmail('anndroyd@mixateria.org', 'OnAfterCreate', body);

onBeforeSave の例

onBeforeSave イベントを使用すると、レコード状態の検証や、最後に変更された時間の追跡を行うことができます。次の例では、2 つのレコード フィールド値が等しい場合に例外をスローします。

if (record.ValueOne === record.ValueTwo) {
  throw new Error("valueOne and valueTwo can't be equal");
}

onAfterSave の例

onAfterSave イベントを使用すると、既存のレコードが変更された後にアクションを実行できます。次の例では、アプリが既存のレコードを更新したときにメールを送信します。

console.log("This is a new name: " + record.name);
sendEmail('anndroyd@mixateria.org', 'onAfterSave', record.name);

onBeforeDelete の例

onBeforeDelete イベントを使用すると、レコードのバックアップを異なるモデルの別のレコードに保存できます。

var backupRecord = app.models.BackupRecords.newRecord();
backupRecord.Name = record.Name;
app.saveRecords([backupRecord]);

onAfterDelete の例

onAfterDelete イベントを使用すると、レコードが削除された後にアクションを実行できます。次の例では、アプリがレコードを削除したときに、コンソールにイベントを表示します。

console.log("the deleted record name is " + record.name);
var rec = app.models.ArchivedEmp.newRecord();
rec.name = record.name;
app.saveRecords([rec]);
console.log("SAVED");