我对JavaScript编程比较陌生,所以这个问题可能有一个简单的解决方案。使用Sails.js,我创建了这个模型。
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方法。我来这个解决方案(使用Underscore.js):
FOOS = _.map(FOOS, function(FOO){ FOO.BAR2 = FOO.BAR2(); return FOO; });
但我认为它没有效率/智能,因为我认为我可能会再次发现这个问题。你会怎么做?谢谢
答案 0 :(得分:3)
如果您只想为每个新实例设置计算值,则可以将BAR2
设置为模型中的number
类型(而不是函数),并添加{{ 1}}类方法如:
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;
}
方法。
答案 1 :(得分:0)
如果您在请求期间(即在查询回调中)调用了您的实例方法,您可能需要检查传入的结果。
就我而言,我使用的是Sails / Waterline ORM模型方法find
而不是findOne
(就像一个骨头),它实际上是一个集合(数组)。所以我尝试了以下几点:
[ {...} ].hasItem(id)
......虽然我需要的是:
myQueryResults[0].hasItem(id)
或者更确切地说,使用findOne
正确查询。 Idiocy显然是一种糟糕的做法,但我想这就是它。
希望这有帮助!