【问题标题】:Angular slickgrid dynamic editor collection by every row data每行数据的 Angular slickgrid 动态编辑器集合
【发布时间】:2020-12-18 17:34:19
【问题描述】:

这是我的 slickgrid 数据集

[{title : 'foo', prerequisites : true}, {title : 'bar', prerequisites : false}]

这些是我的列定义:

[
     {
        id: "title",
        name: "Title", 
        field: "title"
     },  
     {
        id: 'prerequisites', name: 'Prerequisites', field: 'prerequisites',
        type: FieldType.string,
        editor: {
          model: Editors.multipleSelect,
          collection: [{ value: '', label: '' }, { value: true, label: 'true' }, { value: false, label: 'false' }]
        }
      }]

这将为先决条件列中的每一行创建一个静态编辑器下拉列表。

但我想要的是,在标题为 foo

的行中,下拉没有真正的选项

换句话说,我想根据相应行中另一列的值隐藏某些选定行的选项。

【问题讨论】:

  • 遗憾的是,您不能使用当前版本执行此操作,我的意思是您可以过滤 collection,如 Wiki 所示,但这是过滤器/编辑器上每一行的全部集合,并且是不能动态改变的。您仅有的 2 个选项是 1)创建自定义编辑器(可能扩展当前选择编辑器)或 2)为库做出贡献...请注意,我是 Angular-Slickgrid 的作者
  • Angular-Slickgrid 的最新版本2.25.0 通过collectionOverride 提供了一个新选项,请参阅下面的更新答案。您还可以对答案和库进行投票;)

标签: slickgrid angular-slickgrid


【解决方案1】:

编辑

使用 Angular-Slickgrid 的最新版本 2.25.0(请参阅 here),我们现在可以选择直接从列定义中覆盖集合,如原始问题中所述。还有一个新的Wiki - Collection Override

例如,您现在可以这样做

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


原始答案 选择编辑器/过滤器从未在构建时考虑到动态集合和对项目数据上下文的访问,但类似于我给您的其他 SO 问题的其他 SO Answer,您可以再次扩展选择编辑器并覆盖 filterCollection() 函数,在renderDomElement() 之前调用它,这是在将输出集合传递给renderDomElement(inputCollection) 函数之前覆盖输出集合的最佳位置

请注意,我没有测试下面的代码,但我希望这个概念可以工作,我不确定 SelectEditor 是否实际上是公开的,如果不是,请尝试扩展 Editors.singleSelectEditors.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 以获取多个或@987654340 @ 表示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;
  }
}

【讨论】:

  • 非常感谢这对我有用。我只是扩展了 Editors.multipleSelect。我还在“filterCollection”方法中取了参数inputCollection并对其进行了操作
【解决方案2】:

您的“multipleSelect”编辑器有一个Init 事件。这是您应该为选择列表选择值的地方。

编辑器是从网格中实例化的,在构造函数的args var 中有很多信息。这是实例化编辑器的网格代码:

  currentEditor = new useEditor({
    grid: self,
    gridPosition: absBox($container[0]),
    position: absBox(activeCellNode),
    container: activeCellNode,
    column: columnDef,
    columnMetaData: columnMetaData,
    item: item || {},
    event: e,
    commitChanges: commitEditAndSetFocus,
    cancelChanges: cancelEditAndSetFocus
  });

您的init 事件可以测试网格的当前行 (args.item) 并为编辑器查找提供行值。

【讨论】:

  • 什么是useEditor?
  • 另外,我需要具备“multipleSelect”的所有功能,并且只想添加此功能。这有可能吗?
  • 上面显示的代码是 slickgrid.js 的内部代码 - 我只是想展示传递给编辑器构造函数的 args 对象。我假设您已经有一个 multipleSelect 编辑器在工作。需要对该编辑器进行更改。也许您可以将编辑器代码添加到您的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2019-03-08
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多