开发者社区> apachecn_飞龙> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

orm2 中文文档 3.3 模型钩子

简介: 译者:飞龙 来源:Model Hooks 如果你想要监听发生在模型实例上的事件,你可以附带一个函数,它会在发生时调用。
+关注继续查看

译者:飞龙

来源:Model Hooks

如果你想要监听发生在模型实例上的事件,你可以附带一个函数,它会在发生时调用。

现在支持下面这些事件:

  • afterLoad:(无参数)加载和准备所用实例之后;
  • afterAutoFetch:(无参数)自动获取关联(如果有的话)之后,无论有没有关联都会触发;
  • beforeSave:(无参数)尝试保存之前;
  • afterSave:(bool success)保存之后;
  • beforeCreate:(无参数)尝试保存新的实例之前(优先于beforeSave);
  • afterCreate:(bool success)保存新的实例之后;
  • beforeRemove:(无参数)尝试删除实例之前;
  • afterRemove:(bool success)删除实例之后;
  • beforeValidation:(无参数)在所有验证之前,优先于beforeCreatebeforeSave

所有钩子函数调用时,this为对应的实例,所以你可以访问到与之相关的任何东西。

对于所有before*钩子,你可以添加一个额外的参数到钩子函数中。这个函数用来告诉钩子应该继续执行下去还是中断。你或许已经从Express的工作流中熟悉了这一点。下面是一个示例:

var Person = db.define("person", {
    name    : String,
    surname : String
}, {
    hooks: {
        beforeCreate: function (next) {
            if (this.surname == "Doe") {
                return next(new Error("No Does allowed"));
            }
            return next();
        }
    }
});

这个工作流允许你在调用next之前执行异步的操作。如果你不打算使用next就不要把它定义为参数,否则会阻塞工作流。

常见问题

一个常见问题涉及到在钩子内部的嵌套回调中访问this。这个问题的原因是,this对象仅仅在顶级钩子函数的作用域内是有效的,而在回调中会有各种不同的值。要解决这一问题,可以创建一个对象保存this的引用,并且在回调中用它来访问模型的属性。

示例

var Person = db.define("person", {
    name    : String,
    surname : String
}, {
    hooks: {
        beforeCreate: function (next) {
            var _this = this;
            checkName(this, function(err, result)) {
                if(err) return next(err);
                _this.name = result.name;
                _this.surname = result.surname;
                next();
            }
        }
    }
});

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CSS盒模型 - 官方文档总结
CSS盒模型 - 官方文档总结
22 0
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V3_2版本数据集
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V3_2版本数据集
42 0
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) 数据集
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) 数据集
123 0
JS--DOM(文档对象模型)
含义 DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API,通过 DOM 可以去改变文档。 简单的说,一个 web 网页就是一个文档,使用 DOM 改变文档就是使用 DOM 定义的一些方法操作具体的节点。
874 0
《软件工程方法与实践》—— 3.2 什么是软件过程模型
为了能高效地开发一个高质量的软件产品,通常把软件生存周期中各项开发活动的流程用一个合理的框架—开发模型来规范描述,这就是软件过程模型,或者称为软件生存周期模型。所以,软件过程模型是一种软件过程的抽象表示法,“建模”是软件过程中常使用的技术手段之一。
1168 0
orm2 中文文档 2. 设置
译者:飞龙 来源:Settings 设置用于储存键值对。设置对象是orm(默认值)上的实例,之后会为每个db连接和每个定义过的Model建立快照。
686 0
orm2 中文文档 4.2 hasMany(多对多关系)
译者:飞龙 来源:hasMany hasMany 是多对多的关系(包括连接表)。 例如:Patient.hasMany('doctors', Doctor, { why: String }, { reverse: 'patients', key: true })。
637 0
Android官方入门文档[17]构建灵活的UI
Android官方入门文档[17]构建灵活的UI Building a Flexible UI构建灵活的UI   This lesson teaches you to1.
889 0
+关注
apachecn_飞龙
Github:@wizardforcel 简书:@ApacheCN_飞龙 微博:@龙雀 CSDN:@wizardforcel ApacheCN 官网:apachecn.org 机器学习交流群:629470233
719
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载