javascript - 由于 Access/Loaded Hook 的上下文对象中缺少模型实例,无法更改所需的属性值(LoopBack3)
问题描述
每当在此模型上调用 find 时,我想更改 someModel 中的属性。因为我不能使用远程钩子,因为 find 不是远程方法,而是内置的,并且在操作钩子中 find/findOne 只会触发访问和加载的钩子,并且根据我的研究,它们不会在其 ctx 中返回模型实例(或者如果他们这样做,我想知道在哪里),我想做类似的事情:
modelName.observe('loaded', function (ctx, next) {
ctx.someModel_instance.updateAttribute(someCount, value
,function(err, instance){
if (err) next(err)
else{
console.log("done")
}
});
}
解决方案
解决方法:
Asloaded
不返回模型实例,但它确实返回ctx.data
,其中它返回模型中数据的副本,如果您的模型中碰巧有一个唯一ID
的,那么您可以通过获取模型实例findById
并可以持久地访问/更改所述模型的属性。例如:
modelName.observe('loaded', function (ctx, next) {
modelName.findOne({
where: {id : ctx.data.id},
},function(err, someModel_instance){
if (err) next(err)
else{
someModel_instance.updateAttribute(someCount,value
, function(err, instance){
console.log(done)
});
}
});
next();
} );
这可以解决问题,但问题将是它导致的不间断递归。asfindOne
和updateAttribute
将触发loaded hook
再次等等。这可以通过使用ctx.options
字段来解决,该字段就像一个空容器,可用于存储标志。例如:
modelName.observe('loaded', function (ctx, next) {
if(ctx.options && !ctx.options.alreadyFound){
modelName.findOne({
where: {id : ctx.data.id},
},{alreadyFound = true}, function(err, someModel_instance){
if (err) next(err)
else{
someModel_instance.updateAttribute(someCount,value
,{alreadyFound = true}, function(err, instance){
console.log(done)
});
}
});
}
next();
});
推荐阅读
- java - 如何在 JTree 中只显示根目录?
- c++ - 为什么我的变量没有更新并且我的 LED 不亮?
- r - 将多个变量合并为新变量/将变量拆分为 3 个变量
- excel-formula - Textjoin:使用唯一 ID,如何连接多个值?
- go - 如何在 go 中获取私有 reflect.Value 的内容?
- vbscript - 如何重命名文件并覆盖 VBS 中的现有文件?
- reactjs - 当使用 redux-thunk 的异步 api 调用导致 redux 道具更改时不会触发 UseEffect
- delphi - DELPHI - 除了块中的额外分号,有什么目的吗?在 except 或 end 之前可选分号,有或没有哪个更好?
- byte-buddy - 使用字节伙伴向静态方法添加注释
- python - 使用 Selenium 驱动程序在 XPath 中找不到元素