Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向sails.js中的所有模型添加实例方法?_Javascript_Node.js_Express_Sails.js_Waterline - Fatal编程技术网

Javascript 如何向sails.js中的所有模型添加实例方法?

Javascript 如何向sails.js中的所有模型添加实例方法?,javascript,node.js,express,sails.js,waterline,Javascript,Node.js,Express,Sails.js,Waterline,我想向所有使用元数据(与属性/关联定义不同)的模型添加一个默认的toDisplay函数,以对实例的属性/关联执行操作,使它们适合在UI中显示 例如: Foo.findOne(someId) .exec(函数(err,foo){ ... res.view({ foo:foo.toDisplay(), }); });这可以通过将函数添加到模型属性中来实现,如下所示: module.exports = { attributes: { attribute1: {

我想向所有使用元数据(与属性/关联定义不同)的模型添加一个默认的toDisplay函数,以对实例的属性/关联执行操作,使它们适合在UI中显示

例如:

Foo.findOne(someId)
.exec(函数(err,foo){
...
res.view({
foo:foo.toDisplay(),
});

});这可以通过将函数添加到模型属性中来实现,如下所示:

module.exports = {
    attributes: {
        attribute1: {
            type: String
        },
        attribute2: {
            type: String
        },
        toDisplay: function () {
            // your function here
        }

        // You can also override model functions like .toJSON or .toObject
        toJSON: function () {
            // your custom JSON here
        }
    }
}

在属性方法下的中有更多信息。值得注意的是,根据您所做的工作,您可能根本不需要
toDisplay()
方法;如果您只是尝试格式化任何输出或删除任何敏感信息,则可以重写
toJSON()
方法。

模型配置已完整记录@umassthrower正确地指出,将实例方法添加到
config/models.js
会将其添加到所有模型中;他还正确地指出,这不是配置文件的预期用途

您发现在Sails中比Rails更具挑战性的原因是Ruby有真正的类和继承,而Javascript只有对象。模拟继承并从“基本”对象扩展模型对象的一种相当干净的方法是使用以下内容。例如,您可以将基本模型保存在
lib/BaseModel.js
中:

// lib/BaseModel.js
module.exports = {

  attributes: {

    someAttribute: 'string',

    someInstanceFunction: function() {
      // do some amazing (synchronous) calculation here
    }

  }

};
然后在您的模型文件中,需要
lodash
并使用
\uux.extend

// api/models/MyModel.js
var _ = require('lodash');
var BaseModel = require("../../lib/BaseModel.js");
module.exports = _.merge({}, BaseModel, {

  attributes: {

    someOtherAttribute: 'integer'

  }

};
基本模型中的属性将与
MyModel
合并,以
MyModel
优先

将第一个参数设置为空模型
{}
在这里很重要
\.merge
对于发送进来的第一个对象是破坏性的,因此如果您刚刚执行了
\.merge(BaseModel,{…}
,则会修改基本模型


另外,请记住
npm安装lodash

好的,让我们看看添加更多标记是否能在40小时内获得超过12个视图(其中4个是我的).我已经有了,问题是把它放在每个模块上。这当然可以做到,而且我相信我可以通过窥探水线的核心并扩展水线中的原型来找到一种非升级安全的方法,但我希望会有一种更受认可的方法。所以我猜你是说,这是v0.10中没有任何标准方式支持它,所以我必须自己解决它。我已经阅读了所有文档,并查看了默认方法添加到模型中的水线代码:@umassthrower Ohhh,我误解了。你试图将它放在每个模块上,而不是单个模型上……嗯。事实上,这是个好问题。我的糟糕。是的,没问题。我已经用六种其他语言完成了这项工作,其中最简单的是Ruby,但我还没有找到在Sails中完成这项工作的最佳方法。考虑到JavaScript的原型性质,如果我能掌握模型并在适当的位置进行扩展,应该会很容易。你检查过
/config/models
在您的sails项目中?可能有一种方法可以在那里添加一个新的实例方法,尽管我不是很确定(因为我从未尝试过这个)。这似乎是一个合理的方法,而且比将这些添加到config/models.js中更容易接受。我仍然需要为每个模型添加一行额外的内容,但至少只需添加一次,然后我就可以将该结构放置到位。我会尝试一下,谢谢!我是个懒人,如果我想为每个模型添加内容,我会被迫在每个模型中添加相同的内容每一个模型文件都让我很恼火。-1-对我来说,它并没有回答问题-你仍然需要对每一个模型做一些事情。