如何在Sails / Waterline中的生命周期回调中调用模型实例方法?

时间:2013-10-17 08:03:09

标签: javascript node.js sails.js waterline

我已经设置了一个包含2个实例方法的简单模型。如何在生命周期回调中调用这些方法?

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();
    })
  }

};

3 个答案:

答案 0 :(得分:2)

看起来自定义定义的实例方法不是设计为在生命周期中调用,而是在查询模型之后。

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

答案 1 :(得分:2)

尝试在常规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();
    })
  }

};

答案 2 :(得分:1)

doSomething doAnotherThing 不是属性,是方法,必须处于Lifecycle回调级别。尝试这样的事情:

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'),但它是模型的一个实例,因此您无法像“参数”那样传递它“字符串。而不是尝试分开执行此功能,并将工作