首页 > 解决方案 > 由于 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")
                 }

      });


} 

标签: javascriptloopbackangular-loopback

解决方案


解决方法: 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();
} );

这可以解决问题,但问题将是它导致的不间断递归。asfindOneupdateAttribute将触发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();
});

推荐阅读