一尘不染

继承Sails.js模型的属性和生命周期功能

node.js

我想创建一组自定义的属性和生命周期方法,以在所有Sails.js模型之间共享。

Sails.js通过调用Waterline.Collection.extend()方法并提供在/api/models目录中找到的模型定义来自动创建和注册模型对象。

从父级扩展模型定义的最佳方法是什么?我已经尝试过使用,_.extend(sails.config.model.parentModel, childModel)但是可悲的sails是该对象没有全局公开(因为这是在加载orm挂钩之后完成的)。我还可以简单地require()将所有模型中的基本模型进行扩展。

什么是与Sails一起使用的干净方法?


阅读 184

收藏
2020-07-07

共1个答案

一尘不染

使用config/models.js为模型提供全局默认值是完全合法的。关于覆盖实例和类方法,根据我的测试,没有什么值得关注的。定义sails.config.models模型定义中存在的属性/方法将对此模型覆盖它,而未定义则不会。

定义

// config/models.js
module.exports.models = {
  attributes: {
    // base model instanceMethod
    toJSON: function() {
      console.log('base.toJSON');
      return this.toObject();
    }
  },

  // base model classMethod
  test: function() {
    console.log('base.test');
  }
};


// api/models/first.js
module.exports = {
  attributes: {

  },

  // Overriding classMethods and lifecycle callbacks
  test: function() {
    console.log('first.test');
  }
};

// api/models/second.js
module.exports = {
  attributes: {
    // Overriding instance methods and attributes
    toJSON: function() {
      console.log('second.toJSON');
      return this.toObject();
    }
  },
}

测验

> sails.models.first.test();
>'first.test' // sails.config.models.test overridden

> sails.models.first.findOne(1).exec(err,res){ res.toJSON();  });
> 'base.toJSON' // sails.config.models.attributes.toJSON not overridden

> sails.models.second.test();
> 'base.test'; // sails.config.models.test not overridden

> sails.models.second.findOne(1).exec(err,res) { res.toJSON(); });
> 'second.toJSON' // sails.config.models.attributes.toJSON overridden
2020-07-07