首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展bookshelf.js

如何扩展bookshelf.js
EN

Stack Overflow用户
提问于 2016-03-10 02:05:14
回答 2查看 793关注 0票数 0

我有一个几乎要复制到每个模型中的验证函数。我想通过扩展基本的bookshelf.Model对象来抽象它。我不确定在ES6中这样做的正确方式是什么。我想不用分叉书架来做这件事。

示例模型:

代码语言:javascript
复制
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;

main bookshelf file is here

EN

回答 2

Stack Overflow用户

发布于 2016-03-10 17:54:54

我不知道如何扩展书架,所以我这样解决了它:

代码语言:javascript
复制
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;

和新的验证文件:

代码语言:javascript
复制
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());
};
票数 1
EN

Stack Overflow用户

发布于 2016-03-10 06:12:19

我认为你需要Facade或Decorator模式+一些依赖注入。

我以以下方式使用Facade实现自己的目的:

代码语言:javascript
复制
class MyFacade {

  constructor(legacyLibrary) {
    this.legacyLibrary = legacyLibrary;
  }

  newMethod() {
    this.legacyLibrary.doSomething();
    this.legacyLibrary.doSomethingElse();
  }

}

export default MyFacade;

装饰器的概念是一样的,但是你应该扩展你现有的类。因此,所有的功能都将保持不变,但您将拥有更多的方法。

装饰器的好处是你可以嵌套它们。先用一个装饰,然后再用另一个装饰,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35899230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档