Sails.js:添加自定义实例方法结果作为模型属性
我对JavaScript编程相对来说比较新,所以这个问题可能有一个小小的解决scheme。 使用Sails.js,我创build了这个模型。
module.exports = { tableName: 'FOO_TABLE', attributes: { FOO: 'string', BAR: 'number', BAR2: function() { return this.BAR + 1; } }, };
然后,在一个控制器中,我得到所有的实例:
FOO_MODEL.find().exec(function(err, FOOS) { return res.view({data: JSON.stringify(FOOS)}); });
问题是,在FOOS内部,这不是BAR2方法。 我已经使用了这个解决scheme(使用Underscore.js):
FOOS = _.map(FOOS, function(FOO){ FOO.BAR2 = FOO.BAR2(); return FOO; });
但是我不认为它是有效的/聪明的,因为我想我可能会再次发现这个问题。 你会怎么做? 谢谢
如果你想要为每个新实例设置一个计算值,你可以设置BAR2
为模型中的typesnumber
(而不是函数),并添加一个beforeCreate
类的方法,如:
beforeCreate: function(values, cb) { values.BAR2 = values.BAR + 1; return cb(); }
如果要将BAR2
作为实例方法保留,但要将其与对象一起序列化,则可以覆盖默认的toJSON
实例方法:
toJSON: function() { var obj = this.toObject(); obj.BAR2 = obj.BAR2(); return obj; }
任何时候一个实例被string化,它的toJSON
方法将被调用。
检查您的查询结果
如果你在请求期间调用你的实例方法,也就是在查询callback中,你可能想要检查你传入的结果。
在我的情况下,我正在使用帆/水线ORM模型方法, find
而不是findOne
(如骨头),其实际上是一个集合( 数组 )。 所以我尝试了一下:
[ {...} ].hasItem(id)
…而我需要的是这样的:
myQueryResults[0].hasItem(id)
或者说,使用findOne
正确查询。 白痴似乎是一个不好的做法,但是我猜想。
希望这个帮助!