1

当使用具有单选模式的数据网格时,在呈现数据网格后 - 如果我们尝试通过更新绑定到的变量来设置当前选择的值,则[(clrDgSingleSelected)]即使正在设置的对象是相应的单选按钮也不会被“选中”按值等于数据网格项之一。仅当对象通过引用数据网格中的一项而相等时,该选择才有效。

使用[(clrDgSelected)].

重现行为的步骤:

  1. 以显示用户列表并使用“trackById”的数据网格为例。
  2. 在组件构造函数中,尝试设置单选值,但使用克隆对象。
    setTimeout(() => {
      this.selectedUser = {...this.users[2]}; 
    }, 4000);

在现实生活中 - 不是有意克隆对象 - 但是已经有一个希望设置为选择的对象,并且数据网格刚刚使用来自服务器的新数据进行渲染,它们都是新创建的对象。datagrid 中的对象之一按值匹配要选择的对象,但不按引用匹配。


Stackblitz(单选问题):https ://stackblitz.com/edit/clarity-v2-dg-selection

Stackblitz(多选问题):https ://stackblitz.com/edit/clarity-v2-dg-selection-multiple


我确实在 Clarity ( https://github.com/vmware/clarity/issues/4250 )上打开了一个错误,但有人提到它是一个使用问题。

我希望 Clarity 团队的某个人重新审视这种情况并提出解决方法/修复。

4

1 回答 1

2

我在我们的代码中也遇到了类似的问题,因为清晰数据网格通过引用进行比较。我正在采取以下方法来识别列表中的选定对象:

import {   
  intersectionBy as _intersectionBy, 
  differenceBy as _differenceBy, 
  uniqBy as _uniqBy } 
from 'lodash';    
private renewSelectedItems<EntityType>(datagridItemList: EntityType[], selected: EntityType[], matchProperty = 'id') {
    const currentGridSelected = _intersectionBy(datagridItemList, selectedItems, matchProperty);
    const selectedItemsNotInDatagridItemList = _differenceBy(selectedItems, datagridItems, matchProperty);
    const selectedObjects = _uniqBy([...currentGridSelected, ...selectedItemsNotInDatagridItemList], matchProperty);

    return selectedObjects;
}

renewSelectedItems每当我们刷新网格数据或选择更改时,我都会调用此方法。

this.selected = this.renewSelectedItems(this.allItems, this.selected, 'id');

希望这会有所帮助。

于 2020-02-05T17:10:20.077 回答