在我当前的项目中,我需要能够自定义过滤器的顺序。之后丢失索引的问题canvas.toDatalessJSON()
让我想到了为此制定一个简单的解决方案。每次加载画布时,我都会简单地构建一个新的过滤器名称数组。
const filterNamesDefault = ['Contrast', 'Saturation', 'Sharpen', 'Tint', 'invert', 'grayscale', 'Sepia'];
var filterNames = [];
var canvasLoaded = false;
canvasLoaded
是一个布尔值,在加载画布时必须设置为 true。然后在applyFilterType
andapplyFilterValue
函数中,我为函数提供了过滤器类型而不是索引:
function filterIndex(filterType) {
if (canvasLoaded) { return filterNames.indexOf(filterType); } else { return filterNamesDefault.indexOf(filterType); }
}
function applyFilterType(type, filter) {
var index=filterIndex(type);
...
}
function applyFilterValue(type, prop, value) {
var index=filterIndex(type);
...
}
假设我像往常一样添加了一些['Sharpen','Tint']
存储在canvas.filters
对象中的过滤器,并且在画布保存/加载后重新定位。然后,当我想显示图像层的过滤器编辑框时,我执行以下操作:
var obj = canvas.getActiveObject();
filterNames = [];
obj.filters.forEach(function(f,i){
filterNames.push(f.type);
});
for (var i=0;i<filterNamesDefault.length;i++){
if (!filterNames.includes(filterNamesDefault[i])) filterNames.push(filterNamesDefault[i]);
}
现在的新订单filterNames
是:
['Sharpen', 'Tint', 'Contrast', 'Saturation', 'invert', 'grayscale', 'Sepia']
它也适用于过滤器的新顺序。