【问题标题】:Sails.js : Add custom instace method result as a model propertySails.js :添加自定义实例方法结果作为模型属性
【发布时间】:2014-03-04 22:32:33
【问题描述】:

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

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

【问题讨论】:

  • 您能否详细说明您要完成的工作?此外,您的 BAR2 实例方法可能不是您想要的 - 它当前将“1”添加到函数对象 (this.BAR2)。
  • 对不起,我打错了,现在已经修复了。我想以 JSON 格式发送所有实例的键值对,包括从方法中获得的那些。

标签: javascript node.js sails.js


【解决方案1】:

如果您只想为每个新实例设置一个计算值,您可以在模型中将BAR2 设置为number 类型(而不是函数),并添加一个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;
}

只要一个实例被字符串化,它的toJSON方法就会被调用。

【讨论】:

  • 第一个是我一直在寻找的,但第二个对未来也很有趣,谢谢!
  • workplace_branch: function(){ return this.address_street_first + ' '+ this.address_street_second; }, toJSON: function() { var obj = this.toObject(); obj.workplace_branch = obj.workplace_branch();返回对象;我收到此错误:TypeError: Property 'workplace_branch' of object [object Object] is not a function
【解决方案2】:

检查您的查询结果

如果您在请求期间调用实例方法,即在查询回调中 - 您可能需要检查传入的结果。

就我而言,我使用的是 Sails/Waterline ORM 模型方法 find 而不是 findOne(就像一个傻瓜),它实际上是一个集合(array)。所以我尝试了一些类似的东西:

[ {...} ].hasItem(id)

...而我需要的是:

myQueryResults[0].hasItem(id)

或者更确切地说,使用findOne 正确查询。白痴显然是一种糟糕的做法,但我猜它确实发生了。

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2014-09-27
    • 2016-01-12
    • 2015-12-01
    • 2020-11-23
    • 1970-01-01
    • 2016-10-14
    • 2020-03-22
    相关资源
    最近更新 更多