Loopback: создание динамических свойств для экземпляра модели - PullRequest
0 голосов
/ 16 мая 2018

Например, у меня есть петлевое имя модели Event, и у него есть 2 свойства, например:

...
"properties": {
  "name": {
    "type": "string",
    "required": true
  },
  "end": {
    "type": "date",
    "required": false
  }
}...

Как добавить динамическое имя свойства status с такой логикой:

if (now() > this.end) {
  this.status = 'end';
} else {
  this.status = 'running';
}

Также я хочу иметь status в ответах JSON и для REST API Loopback.Спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Если вы добавите обязательное свойство ctx в удаленный хук или хук операции, свойство будет добавлено в модель и сохранено в базе данных.

Использование удаленного подключения,

Event.beforeRemote('*', (ctx, modelInstance, next) => {
    ctx.req.body.propertyName = propertyValue;
    ...
    next();
});

Здесь * может быть любое действие для любой конечной точки. Для получения более подробной информации см. this .

Использование операционного хука,

Event.observe('before save', (ctx, next) => {
   //for insert, full update
   if(ctx.instance) {
       ctx.instance.propertyName = propertyValue;
       ...
       return next();
   } 
   // for partial update
   else if(ctx.data) { 
       ctx.data.propertyName = propertyValue;
       ...
       return next();
   }
}); 
0 голосов
/ 16 мая 2018

Я думаю, что самый простой способ сделать это с помощью удаленных хуков и просто добавить свойство в набор результатов, если это применимо.Перефразируя документацию:

Event.afterRemote('**', function (ctx, user, next) {
  const now = new Date();
  if(ctx.result) {
    if(Array.isArray(ctx.result)) {
      ctx.result.forEach(function (result) {
        result.status = now > result.end ? 'end' : 'running';
      });
    } else {
      result.status = now > result.end ? 'end' : 'running';
    }
  }

  next();
});
...