我想创建一组自定义的属性和生命周期方法,以在所有Sails.js模型之间共享。
Sails.js通过调用Waterline.Collection.extend()方法并提供在/api/models目录中找到的模型定义来自动创建和注册模型对象。
Waterline.Collection.extend()
/api/models
从父级扩展模型定义的最佳方法是什么?我已经尝试过使用,_.extend(sails.config.model.parentModel, childModel)但是可悲的sails是该对象没有全局公开(因为这是在加载orm挂钩之后完成的)。我还可以简单地require()将所有模型中的基本模型进行扩展。
_.extend(sails.config.model.parentModel, childModel)
sails
require()
什么是与Sails一起使用的干净方法?
使用config/models.js为模型提供全局默认值是完全合法的。关于覆盖实例和类方法,根据我的测试,没有什么值得关注的。定义sails.config.models模型定义中存在的属性/方法将对此模型覆盖它,而未定义则不会。
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