javascript 我怎样才能在sails.js中给所有的Model添加一个示例方法呢?

carvr3hs  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(144)

我想为所有模型添加一个默认的toDisplay函数,它将使用元数据(与属性/关联定义类似)对示例的属性/关联执行操作,使它们适合在UI中显示。
例如:

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

所以,我想把这个功能加到所有型号上。我可以想象

Model.prototype.toDisplay = ...

解决方案,但我不确定从哪里获取模型(一些较长的要求('waterline/... ./model')路径?),以及如果我有模型,在哪里放置它。
请指示。

pokxtpni

pokxtpni1#

模型配置在SailsJS.org上有完整的文档记录。@umassthrower正确地指出,向config/models.js添加示例方法会将其添加到所有模型中;他还正确地指出,这不是配置文件的预期用途。
你会发现在Sails中比在Rails中更有挑战性的原因是Ruby有真实的的类和继承,而Javascript只有对象。模拟继承和从“基”对象扩展模型对象的一个相当干净的方法是使用Lodash的_.merge函数。例如,你可以将基模型保存在lib/BaseModel.js中:

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

  attributes: {

    someAttribute: 'string',

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

  }

};

然后在您的模型文件中,需要lodash并使用_.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 install lodash

aurhwmvo

aurhwmvo2#

在Sails 0.x中,当模块加载器被加载时,你可以直接访问sails.models,但是现在在1.x中,这还没有准备好,所以,我的解决方案是创建一个定制的钩子来 Package sails.modules的loadModels函数,这可能不是最好的解决方案,但对我来说是有效的@ adam-pietrasiak希望这对你也有效:)我在重复代码方面也超级懒。
//在api/hooks/overrides.js中提供此代码或使用其他名称,无所谓

const _ = require('lodash');

module.exports = function (sails) {
    return {
        defaults: {},
        savedModelLoad: null,

        configure: function () {
            this.savedModelLoad = this.savedModelLoad || sails.modules.loadModels;
            sails.modules.loadModels = this.loadModelsAndApplyOverrides;
        },

        loadModelsAndApplyOverrides: function(cb){
            this.savedModelLoad(function (err, models) {
                const newModels = _.map(models, applyModelOverrides);

                cb(err, newModels);
            });
        }
    };
};

function applyModelOverrides(model) {
    return _.merge(model, {
      // do your custom stuff here
        attributes: {

            someAttribute: 'string',

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

        }
    });
}

相关问题