我有一个几乎要复制到每个模型中的验证函数。我想通过扩展基本的bookshelf.Model对象来抽象它。我不确定在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;发布于 2016-03-10 17:54:54
我不知道如何扩展书架,所以我这样解决了它:
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());
};发布于 2016-03-10 06:12:19
我认为你需要Facade或Decorator模式+一些依赖注入。
我以以下方式使用Facade实现自己的目的:
class MyFacade {
constructor(legacyLibrary) {
this.legacyLibrary = legacyLibrary;
}
newMethod() {
this.legacyLibrary.doSomething();
this.legacyLibrary.doSomethingElse();
}
}
export default MyFacade;装饰器的概念是一样的,但是你应该扩展你现有的类。因此,所有的功能都将保持不变,但您将拥有更多的方法。
装饰器的好处是你可以嵌套它们。先用一个装饰,然后再用另一个装饰,等等。
https://stackoverflow.com/questions/35899230
复制相似问题