事件

每当应用的界面或客户端脚本(而不是服务器脚本)通过数据源访问或修改数据时,会触发数据事件。事件还会触发应用检查访问权限。您可以输入在发生数据事件时运行的客户端脚本,例如在用户更新或删除记录时向管理员发送电子邮件。数据事件与微件事件是分开的。

当您使用数据事件来触发客户端脚本时,请考虑以下事项:

  • 客户端脚本可以执行用于访问或修改数据的服务器端脚本。但是,服务器端脚本不会触发数据事件或权限检查,因为它们通过模型而不是数据源来处理数据。对于服务器脚本,您必须将自己的最终操作安全性编写在脚本中。

  • 如果对多条记录发起请求或进行修改,则系统会为每条记录触发一个事件。例如,系统会为返回到客户端的每条记录触发 onAfterLoad 事件。

  • 在事件脚本中调用费用高昂的操作(例如执行查询或保存记录)时,请务必谨慎。客户端操作通常会同时处理多条记录,因此您的脚本可能会运行多次。如需提高代码的性能,您可以尝试使用缓存。

添加事件脚本

  1. 在应用制作工具的左侧导航中,点击您要向其中添加事件的模型。
  2. 转到 Events 标签页。
  3. 点击您要添加的事件类型。

    数据事件类型
    onAfterLoad 此事件发生在服务器返回记录之前。
    onBeforeCreate 此事件发生在客户端创建记录之后,到该记录被保存到数据库之前的这段时间内。
    onAfterCreate 此事件发生在客户端创建记录且服务器将其保存到数据库之后,到客户端加载此更改之前的这段时间内。
    onBeforeSave 此事件发生在客户端对记录应用更改之后,到该记录被保存到数据库之前的这段时间内。
    onAfterSave 此事件发生在客户端对记录进行更改并且服务器将记录保存到数据库之后,到客户端加载此更改之前的这段时间内。
    onBeforeDelete 此事件发生在客户端发出删除记录的请求之后,到该记录从数据库中删除之前的这段时间内。
    onAfterDelete 此事件发生在客户端向服务器发出从数据库中删除记录的请求之后,到客户端加载此删除更改之前的这段时间内。

  4. 在代码编辑器中输入您的脚本。您可以使用 record 变量来表示触发事件的记录。以下部分提供了事件脚本的示例。

事件异常

当发生某事件时,应用制作工具会检查相关的模型和关系权限,并执行事件的脚本。如果权限检查失败或脚本引发异常,则应用制作工具将取消该事件并向客户端返回一个错误。当取消 onAfterLoad 事件时,服务器不会返回记录。当其他事件被取消时,数据库不会被修改。

事件脚本示例

onAfterLoad 示例

您可以使用 onAfterLoad 事件跟踪哪些用户访问了记录。例如,您可以将当前用户的电子邮件地址保存在记录的 LastVisitor 值中:

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 事件来验证记录中的状态或跟踪上次修改时间。例如,当两个记录字段值匹配时会返回错误:

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

onAfterSave 示例

现有记录更改后,您可以使用 onAfterSave 事件执行操作。例如,在应用更新记录时发送一封电子邮件。

if (record.CcEmailAddress) {
      sendEmail(record.CcEmailAddress, 'Ticket ' + record.Name + ' was updated', 'Please review the change');
    }
    

onBeforeDelete 示例

在记录删除前,您可以使用 onBeforeDelete 事件执行操作。例如,将记录的备份存储到其他模型的不同记录中:

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

onAfterDelete 示例

在记录删除后,您可以使用 onAfterDelete 事件执行操作。例如,在应用删除记录时,在审核日志中记录一个删除事件。

var auditRecord = app.models.AuditLog.newRecord();
    auditRecord.Message = 'Ticket ' + record.Name + ' was deleted by ' + Session.getEffectiveUser().getEmail();
    app.saveRecords([auditRecord]);