环回:检测模型的变化

时间:2016-05-16 06:06:51

标签: loopbackjs

我试图在我的/models/LocatableUser.js中使用的钩子中的总体目标是弄清楚是否需要更新的实际更改,如果有,请做一些事情(制作另一个api)呼叫)。

我有一个继承自此自定义模型的自定义模型结构,因此在父模型中定义before save挂钩时,它适用于两个子模型。以下是我在父模型LocatableUser中定义的方法示例:

LocatableUser.observe('before save', function (ctx, next) {
    if (ctx.instance){  // new record
      ctx.instance._address.getGeopoint(function (error, location) {
        setLocation(error, location, ctx.instance, next);
      });
    } else if (ctx.currentInstance) { // this is an update, currentInstance is treated as immutable
      LocatableUser.findById(ctx.currentInstance.id, function(err, data) {
        console.log('Locatable User: current data is: ', err, data)
      })
      console.log('Locatable User: ctx is:', ctx);
      ctx.currentInstance._address.getGeopoint(function (error, location) {
        setLocation(error, location, ctx.data, next);
      });
    } else {
      console.warn('no context instance');
    }
  });

此代码的问题是,由于没有LocatableUser的具体类,调用LocatableUser.findById()将找不到任何内容,因为实际的类将是{{1}的某个子类}。我发现唯一有效的方法是在两个子类中定义此方法,但这会复制代码。

有没有办法让LocatableUser类调用派生类'findById方法?

Loopback版本2.22.0

1 个答案:

答案 0 :(得分:2)

事实证明我是以错误的方式解决这个问题:

在PUT调用中,ctx.currentInstance作为当前存储的实例进入,无需我按ID查询同一个实例。 ctx.data对象是来自对其余API的调用的实际有效负载,因此我可以将来自该数据的数据与currentInstance进行比较,以确定是否需要运行某些更新逻辑。