【问题标题】:Inherit attributes and lifecycle functions of Sails.js models继承 Sails.js 模型的属性和生命周期函数
【发布时间】:2014-01-26 14:17:54
【问题描述】:

我想创建一组自定义属性和生命周期方法,这些属性和生命周期方法在我的所有 Sails.js 模型之间共享。

Sails.js 通过调用Waterline.Collection.extend() 方法并提供在/api/models 目录中找到的模型定义来自动创建和注册模型对象。

从父级扩展我的模型定义的最佳方式是什么?我已经尝试过使用_.extend(sails.config.model.parentModel, childModel),但遗憾的是sails 对象并未全局公开(因为这是在加载orm 挂钩后完成的)。我也可以简单地 require() 我所有模型中的基本模型并对其进行扩展。

什么是适合 Sails 的干净方法?

【问题讨论】:

  • 刚发现有sails.config.model在归一化时与每个模型合并。在实现生命周期功能时将其用作基本模型是否有意义?我的基本模型定义了toJSON() 方法。当我的子模型也需要覆盖它时,我该怎么办?
  • 目前我正在关注在覆盖时保持父母 toJSON() 行为完好无损。

标签: javascript node.js sails.js waterline


【解决方案1】:

使用config/models.js 为模型提供全局默认值是完全有效的。关于重写实例和类方法,根据我的测试,没有什么值得特别注意的。在模型定义中定义 sails.config.models 中存在的属性/方法将为此模型覆盖它,而未定义则不会。

定义

// config/models.js
module.exports.models = {
  attributes: {
    // base model instanceMethod
    toJSON: function() {
      console.log('base.toJSON');
      return this.toObject();
    }
  },

  // base model classMethod
  test: function() {
    console.log('base.test');
  }
};


// api/models/first.js
module.exports = {
  attributes: {

  },

  // Overriding classMethods and lifecycle callbacks
  test: function() {
    console.log('first.test');
  }
};

// api/models/second.js
module.exports = {
  attributes: {
    // Overriding instance methods and attributes
    toJSON: function() {
      console.log('second.toJSON');
      return this.toObject();
    }
  },
}

测试

> sails.models.first.test();
>'first.test' // sails.config.models.test overridden

> sails.models.first.findOne(1).exec(err,res){ res.toJSON();  });
> 'base.toJSON' // sails.config.models.attributes.toJSON not overridden

> sails.models.second.test();
> 'base.test'; // sails.config.models.test not overridden

> sails.models.second.findOne(1).exec(err,res) { res.toJSON(); });
> 'second.toJSON' // sails.config.models.attributes.toJSON overridden

【讨论】:

  • 是否可以调用父方法?尽管我可以看到列出的函数(通过console.log),但像下面这样调用sails.models.toJSON() 将得到“无方法”错误。 // api/models/second.js module.exports = { attributes: { // 覆盖实例方法和属性 toJSON: function() { var somethingElse =sails.models.toJSON(); // 做其他事情.. return somethingElse; } }, }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多