我想为所有模型添加一个默认的toDisplay函数,它将使用元数据(与属性/关联定义类似)对示例的属性/关联执行操作,使它们适合在UI中显示。
例如:
Foo.findOne(someId)
.exec(function(err, foo) {
...
res.view({
foo: foo.toDisplay(),
});
});
所以,我想把这个功能加到所有型号上。我可以想象
Model.prototype.toDisplay = ...
解决方案,但我不确定从哪里获取模型(一些较长的要求('waterline/... ./model')路径?),以及如果我有模型,在哪里放置它。
请指示。
2条答案
按热度按时间pokxtpni1#
模型配置在SailsJS.org上有完整的文档记录。@umassthrower正确地指出,向
config/models.js
添加示例方法会将其添加到所有模型中;他还正确地指出,这不是配置文件的预期用途。你会发现在Sails中比在Rails中更有挑战性的原因是Ruby有真实的的类和继承,而Javascript只有对象。模拟继承和从“基”对象扩展模型对象的一个相当干净的方法是使用Lodash的
_.merge
函数。例如,你可以将基模型保存在lib/BaseModel.js
中:然后在您的模型文件中,需要
lodash
并使用_.extend
:基础模型中的属性将与
MyModel
合并,MyModel
优先。在这里,将第一个参数设置为空模型
{}
非常重要;_.merge
对于发送进来的第一个对象是破坏性的,所以如果您刚刚执行了_.merge(BaseModel, {...}
,那么基础模型将被修改。还有,记得要
npm install lodash
!aurhwmvo2#
在Sails 0.x中,当模块加载器被加载时,你可以直接访问sails.models,但是现在在1.x中,这还没有准备好,所以,我的解决方案是创建一个定制的钩子来 Package sails.modules的loadModels函数,这可能不是最好的解决方案,但对我来说是有效的@ adam-pietrasiak希望这对你也有效:)我在重复代码方面也超级懒。
//在api/hooks/overrides.js中提供此代码或使用其他名称,无所谓