如何扩展书架.js



>我有一个验证函数,我几乎可以复制到每个模型中。我想通过扩展基础书架来抽象它。模型对象。我不确定在 ES6 中解决这个问题的正确方法是什么。我想在不分叉书架的情况下做到这一点。

示例模型:

import bookshelf from '../bookshelf';
import Checkit from 'checkit';
const Design = bookshelf.Model.extend({
  tableName: 'foo',
  constructor: function() {
    bookshelf.Model.apply(this, arguments); // super()
    this.on('saving', this.validate.bind(this));
  },
  validations: {
    barColumn: ['required', 'integer', 'greaterThan:0'],
  },
  validate: function(model, attrs, options) {
    let validations;
    if (options.patch === true) {
      Object.keys(this.validations).forEach((value, index) => {
        if (this.attributes[index] !== undefined) {
          validations[index] = value;
        }
      });
    } else {
      validations = this.validations;
    }
    return new Checkit(validations).run(this.toJSON());
  }
});
export default Design;

主书架文件在这里。

我无法弄清楚如何扩展书架,所以我像这样解决它:

import bookshelf from '../bookshelf';
import validate from '../utils/validate';
const Design = bookshelf.Model.extend({
  tableName: 'foo',
  constructor: function() {
    bookshelf.Model.apply(this, arguments); // super()
    this.on('saving', validate);
  },
  validations: {
    barColumn: ['required', 'integer', 'greaterThan:0'],
  },
});
export default Design;

和新的验证文件:

import Checkit from 'checkit';
export default function validate(model, attributes, options) {
  let validations;
  if (options.patch === true) {
    Object.keys(model.validations).forEach((value, index) => {
      if (attributes[index] !== undefined) {
        validations[index] = value;
      }
    });
  } else {
    validations = model.validations;
  }
  return new Checkit(validations).run(model.toJSON());
};

我认为您需要外观或装饰器模式+一些依赖注入。

我通过以下方式将 Facade 用于我自己的目的:

class MyFacade {
  constructor(legacyLibrary) {
    this.legacyLibrary = legacyLibrary;
  }
  newMethod() {
    this.legacyLibrary.doSomething();
    this.legacyLibrary.doSomethingElse();
  }
}
export default MyFacade;

装饰器的想法是相同的,但你应该扩展你现有的类。因此,所有功能将保持不变,但您将有更多方法。

装饰器的好处是你可以嵌套它们。用一个装饰,然后用另一个装饰,依此类推。

最新更新