资讯专栏INFORMATION COLUMN

orm2 中文文档 3.3 模型钩子

1treeS / 1714人阅读

摘要:所有钩子函数调用时,为对应的实例,所以你可以访问到与之相关的任何东西。对于所有钩子,你可以添加一个额外的参数到钩子函数中。这个问题的原因是,对象仅仅在顶级钩子函数的作用域内是有效的,而在回调中会有各种不同的值。

译者:飞龙

来源: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();
            }
        }
    }
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17506.html

相关文章

  • orm2 中文文档 3. 定义模型

    摘要:译者飞龙来源在连接之后,你可以使用连接对象来定义你的模型。你需要指定模型的名称,一个用于描述的属性和一些可选的选项。在这个例子中,有个模型方法叫做。接收的第一个对象第二个参数被称为属性对象,它定义了所有的属性。在属性修改时自动保存模型。 译者:飞龙 来源:Defining Models 在连接之后,你可以使用连接对象(db)来定义你的模型。你需要指定模型的名称,一个用于描述的属性和...

    gnehc 评论0 收藏0
  • orm2 中文文档 5. 同步和删除模型

    摘要:译者飞龙来源同步是一项功能方法,可以在数据库里为你的模型和关联创建所需的表来工作。现存的表并不会被替换,它们只会在不存在的时候被创建。删除也有两种方式。从指定模型中删除所有表和为模型创建表 译者:飞龙 来源:Syncing and dropping models 同步是一项功能方法,可以在数据库里为你的模型和关联创建所需的表来工作。现存的表并不会被替换,它们只会在不存在的时候被创建...

    LeanCloud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<