アプリの 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");