Как я могу вызвать метод экземпляра модели в обратном вызове жизненного цикла в Sails/Waterline?

Я создал простую модель с двумя методами экземпляра. Как я могу вызвать эти методы в обратных вызовах жизненного цикла?

module.exports = {

  attributes: {

    name: {
      type: 'string',
      required: true
    }

    // Instance methods
    doSomething: function(cb) {
      console.log('Lets try ' + this.doAnotherThing('this'));
      cb();
    },

    doAnotherThing: function(input) {
      console.log(input);
    }

  },

  beforeUpdate: function(values, cb) {
    // This doesn't seem to work...
    this.doSomething(function() {
      cb();
    })
  }

};

person ragulka    schedule 17.10.2013    source источник


Ответы (3)


Похоже, что настраиваемые методы экземпляра не предназначены для вызова в жизненном цикле, но после запроса модели.

SomeModel.findOne(1).done(function(err, someModel){
   someModel.doSomething('dance')
});

Ссылка на пример в документации - https://github.com/balderdashy/sails-docs/blob/0.9/models.md#custom-defined-instance-methods

person Paweł Wszoła    schedule 04.12.2013
comment
это не объясняет, как вы можете это сделать. Насколько я понимаю, они действительно должны были встроить это, это очень распространенный вариант использования. - person light24bulbs; 12.12.2014

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

// Instance methods
function doSomething(cb) {
  console.log('Lets try ' + this.doAnotherThing('this'));
  cb();
},

function doAnotherThing(input) {
  console.log(input);
}

module.exports = {

  attributes: {

    name: {
      type: 'string',
      required: true
    }
  },

  beforeUpdate: function(values, cb) {
    // accessing the function defined above the module.exports
    doSomething(function() {
      cb();
    })
  }

};
person danba    schedule 25.01.2014
comment
Только что заметил, что вопрос был немного старше, надеюсь, он все еще помогает кому-то наткнуться на него, как я. - person danba; 25.01.2014

doSomething и doAnotherThing не являются атрибутами, являются методами и должны находиться на уровне обратных вызовов жизненного цикла. Попробуйте что-то вроде этого:

module.exports = {

    attributes: {

        name: {
            type: 'string',
            required: true
        }

    },

    doSomething: function(cb) {
        console.log('Lets try ' + "this.doAnotherThing('this')");
        this.doAnotherThing('this')
        cb();
    },

    doAnotherThing: function(input) {
        console.log(input);
    },

    beforeCreate: function(values, cb) {

        this.doSomething(function() {
            cb();
        })
    }

};

Во-вторых, вы пытаетесь отправить на консоль this.doAnotherThing('this'), но это экземпляр модели, поэтому вы не можете передать его как параметр в строке "Давайте попробуем". Вместо этого попробуйте выполнить эту функцию отдельно и будет работать

person crlsmtzprds    schedule 22.10.2016