# 模型鉤子
> 譯者:[飛龍](https://github.com/wizardforcel)
> 來源:[Model Hooks](https://github.com/dresende/node-orm2/wiki/Model-Hooks)
如果你想要監聽發生在模型實例上的事件,你可以附帶一個函數,它會在發生時調用。
現在支持下面這些事件:
+ `afterLoad`:(無參數)加載和準備所用實例之后;
+ `afterAutoFetch`:(無參數)自動獲取關聯(如果有的話)之后,無論有沒有關聯都會觸發;
+ `beforeSave`:(無參數)嘗試保存之前;
+ `afterSave`:(bool success)保存之后;
+ `beforeCreate`:(無參數)嘗試保存新的實例之前(優先于`beforeSave`);
+ `afterCreate`:(bool success)保存新的實例之后;
+ `beforeRemove`:(無參數)嘗試刪除實例之前;
+ `afterRemove`:(bool success)刪除實例之后;
+ `beforeValidation`:(無參數)在所有驗證之前,優先于`beforeCreate`和`beforeSave`。
所有鉤子函數調用時,`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();
}
}
}
});
```