2

我有一个在其模板中呈现 mat-table 的组件。我想预先选择一些行。我拥有的 SelectionModel 包含表示每个选定项目的对象(不是简单的字符串或数字),比较这些对象的方法比本机 SelectionModel 的方法更复杂。

如果这是一个 mat-select 表单控件,我可以使用 [compareWith] 指令来提供自定义比较函数,例如

<mat-select [compareWith]="myCompareFunction"  >...

但这不是合适的解决方案 - 因为我需要一个表格演示文稿。我密切关注 Angular 文档中的示例。这里的 mat-table 示例每行都有一个带有选择复选框的 mat-table,这是我遵循的方法。

在示例的组件代码中,它使用了一个 SelectionModel 对象。

import {SelectionModel} from '@angular/cdk/collections';
....
....
selection = new SelectionModel<PeriodicElement>(true, []);

我正在寻找一种向 SelectionModel 对象提供自定义比较函数的方法。SelectionModel 可以通过函数的覆盖进行子类化,还是可以以某种方式“注入”方法?

我尝试将 SelectionModel 子类化并声明一个新的 compareWith 函数,但这似乎不是所需要的。任何人都可以建议吗?

   import { SelectionModel } from '@angular/cdk/collections';
   import { InputOptionIf } from '../formosa-interfaces/dynamic-field-config-if';

   export class ModalSelectSelectionModel extends SelectionModel<InputOptionIf>{
      compareWith(o1:any,o2:any) {
        console.log("ModalSelectSelectionModel.compareWith()")
        return( <InputOptionIf>o1.label==<InputOptionIf>o2.label);
      }
   }  
4

1 回答 1

0

因此,在检查了源代码之后,似乎不可能对 SelectionModel 进行子类化来替换用于比较对象的方法。这是因为 SelectionModel 的大多数属性在 TypeScript 中被声明为私有。我想这都可以被忽略和覆盖,因为它基本上是 JS 下面,但是当我尝试使用它们时编译器会抱怨 - 我喜欢保持干净的编译。

我所做的是创建一个没有任何继承形式 SelectionModel 的新类。此类实现了我所需的 SelectionModel 子集(切换选择中的项目,并在发生更改时发出事件) - 具有我需要提供一个用于比较对象的函数的能力,并使用这个而不是 Collections/SelectionModel 类。演员阵容有点混乱,但它可以防止编译器呻吟!

this.selectionModel= <SelectionModel<InputOptionIf>><unknown>new MySelectionMode(...)

它现在工作,这就是我所需要的。感谢您的指点。

于 2020-07-02T14:57:40.160 回答