编辑
使用最新版本2.25.0
的 Angular-Slickgrid(参见此处),我们现在可以选择直接从列定义中覆盖集合,如原始问题中所要求的那样。还有一个新的Wiki - 集合覆盖
例如,您现在可以这样做
this.columnDefinitions = [
{
id: 'prerequisites', name: 'Prerequisites', field: 'prerequisites',
type: FieldType.string,
editor: {
model: Editors.multipleSelect,
collection: [{ value: '', label: '' }, { value: true, label: 'true' }, { value: false, label: 'false' }]
},
collectionOverride: (finalCollection, args) => {
console.log(args);
if (args.dataContext.title === 'foo') {
return finalCollection.filter((col) => col.value !== true);
}
return finalCollection;
},
}
}
];
另请注意,所有编辑器、过滤器和格式化程序现在都是公开的,因此更容易从中extend
获取,例如export class CustomSelectEditor extends SelectEditor
原始答案选择编辑器/过滤器从未在构建时考虑到动态集合和对项目 dataContext 的访问,但类似于我给您的其他 SO 问题的其他 SO答案,您可以再次扩展 Select Editor 并覆盖filterCollection()函数,这是在之前调用renderDomElement()
的,这是在将输出集合传递给renderDomElement(inputCollection)
函数之前覆盖输出集合的最佳位置
请注意,我没有测试下面的代码,但我希望这个概念能够工作,我不确定是否SelectEditor
实际上是公开的,如果不是,那么尝试扩展Editors.singleSelect
和Editors.multipleSelect
首先尝试SelectEditor
直接扩展(我认为它们目前不是公开的,这不起作用,但我可能会在未来的版本中改变它)
import { SelectEditor } from 'angular-slickgrid';
export class CustomSelectEditor extends SelectEditor {
constructor(protected args: EditorArguments, protected isMultipleSelect) {
super(args, true);
}
protected filterCollection(): any[] {
const activeCell: { row: number; cell: number; } = this.grid.getActiveCell();
const dataContext = this.grid.getDataItem(activeCell.row);
// your custom logic
// const customCollection = ...
return customCollection;
}
}
或者Editors.singleSelect
如果SelectEditor
不是公开可用的并且如果这是要走的路,那么您还必须扩展Editors.multipleSelect
或创建 1 个自定义编辑器并在通话中传递true
多个或false
单个super(args, true)
import { Editors } from 'angular-slickgrid';
export class CustomSelectEditor extends Editors.inputText {
constructor(protected args: EditorArguments, protected isMultipleSelect) {
super(args, true);
}
protected filterCollection(): any[] {
const activeCell: { row: number; cell: number; } = this.grid.getActiveCell();
const dataContext = this.grid.getDataItem(activeCell.row);
// your custom logic
// const customCollection = ...
return customCollection;
}
}