Sails.js:将自定义实例方法结果添加为模型属性

时间:2014-03-04 22:32:34

标签: javascript node.js sails.js

我对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; });

但我认为它没有效率/智能,因为我认为我可能会再次发现这个问题。你会怎么做?谢谢

2 个答案:

答案 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显然是一种糟糕的做法,但我想这就是它。

希望这有帮助!