如何访问将在 'before delete' 操作挂钩中删除的模态实例?
How to access the modal instance(s) that will be deleted in the 'before delete' operation hook?
before save
和 after save
操作挂钩有一个 data
或 instance
属性 包含将要更改的部分数据或模型实例。参见 here。如何在 before delete
挂钩中访问模型实例?
手头案例:我想在删除特定模型时删除相关项。
我认为您实际上无法访问要删除的特定实例,但您可以访问调用的上下文对象,其中包括用于标识实例的 where
属性 选择删除:
MyModel.observe('before delete', function(context, next) {
console.log('About to delete some: ' + context.Model.pluralModelName);
console.log('using the WHERE clause: ' + context.where);
MyModel.find({ where: context.where }, function(err, models) {
console.log('found some models:', models);
// loop through models and delete other things maybe?
});
next();
});
这在 the documentation 中,但没有很好地解释。您可以使用 contect.Model
对象获取实例,然后您可以访问相关模型并删除它们。
'this' 始终可以在所有挂钩中访问(之前或之后)。
在销毁模型钩子之前 'this' 对象将包含将要销毁的模型实例回送。
下面是使用 findById 的 jakerella 代码的修改版本,计算并删除相关项目(在 'hasMany' 关系中并命名为 'relatedItems'):
MyModel.observe('before delete', function(context, next) {
console.log('About to delete some: ' + context.Model.pluralModelName);
console.log('using the WHERE clause: ' + context.where);
MyModel.findById(context.where.id, function(err, model) {
console.log('found model:', model);
model.relatedItems.count(function(err, count) {
console.log('found ', count, ' related items');
});
model.relatedItems.destroyAll(function(err) {
if (err) {
console.log('found ', count, ' related items');
}
});
next();
});
});
我也使用 before delete
观察器实现了这个。
在此示例中,有一个与许多产品相关的类别模型,由类别 ID 属性 关联。
它首先根据categoryId搜索所有匹配的Products,然后遍历结果集products
逐一删除。
module.exports = function (Category) {
Category.observe('before delete', function (ctx, next) {
// It would be nice if there was a more elegant way to load this related model
var Product = ctx.Model.app.models.Product;
Product.find({
where: {
categoryId: ctx.where.id
}
}, function (err, products) {
products.forEach(function (product) {
Product.destroyById(product.id, function () {
console.log("Deleted product", product.id);
});
});
});
next();
});
};
我尝试使用 destroyAll 方法来实现它,但没有得到预期的结果。
上面的代码对我有用,但看起来它可以增强很多。
before save
和 after save
操作挂钩有一个 data
或 instance
属性 包含将要更改的部分数据或模型实例。参见 here。如何在 before delete
挂钩中访问模型实例?
手头案例:我想在删除特定模型时删除相关项。
我认为您实际上无法访问要删除的特定实例,但您可以访问调用的上下文对象,其中包括用于标识实例的 where
属性 选择删除:
MyModel.observe('before delete', function(context, next) {
console.log('About to delete some: ' + context.Model.pluralModelName);
console.log('using the WHERE clause: ' + context.where);
MyModel.find({ where: context.where }, function(err, models) {
console.log('found some models:', models);
// loop through models and delete other things maybe?
});
next();
});
这在 the documentation 中,但没有很好地解释。您可以使用 contect.Model
对象获取实例,然后您可以访问相关模型并删除它们。
'this' 始终可以在所有挂钩中访问(之前或之后)。 在销毁模型钩子之前 'this' 对象将包含将要销毁的模型实例回送。
下面是使用 findById 的 jakerella 代码的修改版本,计算并删除相关项目(在 'hasMany' 关系中并命名为 'relatedItems'):
MyModel.observe('before delete', function(context, next) {
console.log('About to delete some: ' + context.Model.pluralModelName);
console.log('using the WHERE clause: ' + context.where);
MyModel.findById(context.where.id, function(err, model) {
console.log('found model:', model);
model.relatedItems.count(function(err, count) {
console.log('found ', count, ' related items');
});
model.relatedItems.destroyAll(function(err) {
if (err) {
console.log('found ', count, ' related items');
}
});
next();
});
});
我也使用 before delete
观察器实现了这个。
在此示例中,有一个与许多产品相关的类别模型,由类别 ID 属性 关联。
它首先根据categoryId搜索所有匹配的Products,然后遍历结果集products
逐一删除。
module.exports = function (Category) {
Category.observe('before delete', function (ctx, next) {
// It would be nice if there was a more elegant way to load this related model
var Product = ctx.Model.app.models.Product;
Product.find({
where: {
categoryId: ctx.where.id
}
}, function (err, products) {
products.forEach(function (product) {
Product.destroyById(product.id, function () {
console.log("Deleted product", product.id);
});
});
});
next();
});
};
我尝试使用 destroyAll 方法来实现它,但没有得到预期的结果。
上面的代码对我有用,但看起来它可以增强很多。