首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在角网格中对数据库中的下拉值使用agSelectCellEditor

如何在角网格中对数据库中的下拉值使用agSelectCellEditor
EN

Stack Overflow用户
提问于 2019-12-13 02:49:21
回答 3查看 5K关注 0票数 1

我在角8中使用refData和agSelectCellEditor来显示编辑时的下拉值。为解决我的问题,请参考以下链接:

https://www.ag-grid.com/javascript-grid-reference-data/

但是下拉列表数据是通过HTTP查询从数据库中获取的。我在agGrid中使用“extractValues”,其中包含方法"extractValues()“,如下所示。问题是,该方法在数据来自数据库之前运行,从而导致空白数据。如何解决这个问题?

理想情况下,下拉列表应该包含“是/否”的值。当我用静态列表在顶部声明"objCategoryMappings“时,它就正常工作了。像"refData“这样的限制不适用于数据库中的动态列表吗?如果是这样,那还有什么可供选择的呢?

请参考下面的代码。为了简单起见,我在订阅方法中静态地设置了“是/否”。在实际场景中,我将使用"objCategoryMappings“存储数据库中的值。

代码语言:javascript
运行
复制
<ag-grid-angular class="ag-theme-balham" [gridOptions]="categoryGridOptions"
            [rowData]="categoryRowData" [columnDefs]="categoryColDef"  
            (gridReady)="onGridReady($event)">
        </ag-grid-angular>

TS文件

代码语言:javascript
运行
复制
export class CategoryComponent{
  categoryRowData: any[]; 
  objCategoryMappings = {};

  constructor() {
        this.getAllCategories();                  
  } 

  getAllCategories()
    {            
        this.categoryCommonService.getEntityData('getallcatgories')
            .subscribe((rowData) => {                 
                this.categoryRowData = rowData;               
                this.objCategoryMappings["f"] = "No";
                this.objCategoryMappings["t"] = "Yes";                
            },
                (error) => { alert(error) });       
    }          

  categoryColDef = [
       {
            headerName: 'Category Name', field: 'CategoryName',                        
            cellEditor: 'agLargeTextCellEditor',
            cellEditorParams: {
                maxLength: '50',
                cols: '20',
                rows: '1'
            }
        },
        {
            headerName: 'Is Subcategory', field: 'IsSubcategory', //Values coming from db as "f" and "t"             
            cellEditor: 'agSelectCellEditor',
            cellEditorParams: {
                values: this.extractValues(this.objCategoryMappings),                                
            },                                                      
            refData: this.objCategoryMappings,            
        }];

    extractValues(mappings) {
        return Object.keys(mappings);
    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-13 12:55:29

为什么要在获取网格行数据之后构建objCategoryMappings对象?如我所见,它是静态的,您不需要api响应来构建它。

如果您想保持这个逻辑,那么即使是列定义也应该在api响应之后完成,因为它需要在定义时当前未定义的objCategoryMappings数据:

代码语言:javascript
运行
复制
export class CategoryComponent{
  categoryRowData: any[]; 
  objCategoryMappings = {};
  categoryColDef ;

  constructor() {
        this.getAllCategories();                  
  } 

 getAllCategories()
    {            
        this.categoryCommonService.getEntityData('getallcatgories')
            .subscribe((rowData) => {                 
                this.categoryRowData = rowData;               
                this.objCategoryMappings["f"] = "No";
                this.objCategoryMappings["t"] = "Yes";    
                this.createColumnsDefinition() ;            
            },
                (error) => { alert(error) });       
    }          

createColumnsDefinition(){
     this.categoryColDef = [
       {
            headerName: 'Category Name', field: 'CategoryName',                        
            cellEditor: 'agLargeTextCellEditor',
            cellEditorParams: {
                maxLength: '50',
                cols: '20',
                rows: '1'
            }
        },
        {
            headerName: 'Is Subcategory', field: 'IsSubcategory', //Values coming from db as "f" and "t"             
            cellEditor: 'agSelectCellEditor',
            cellEditorParams: {
                values: this.extractValues(this.objCategoryMappings),                                
            },                                                      
            refData: this.objCategoryMappings,            
        }];

...
}

在html中,您需要等待数据接收才能呈现网格,正如c_ogoo所说:

代码语言:javascript
运行
复制
<ag-grid-angular
  *ngIf="categoryColDef" 
  class="ag-theme-balham" 
  [gridOptions]="categoryGridOptions"
  [rowData]="categoryRowData" 
  [columnDefs]="categoryColDef"  
  (gridReady)="onGridReady($event)"
>
</ag-grid-angular>
票数 3
EN

Stack Overflow用户

发布于 2019-12-13 10:54:10

您可以通过使用ag-grid指令来控制何时需要数据。

代码语言:javascript
运行
复制
<ag-grid-angular
  *ngIf="categoryRowData" 
  class="ag-theme-balham" 
  [gridOptions]="categoryGridOptions"
  [rowData]="categoryRowData" 
  [columnDefs]="categoryColDef"  
  (gridReady)="onGridReady($event)"
>
</ag-grid-angular>

这将延迟ag-grid组件的呈现,直到数据可用为止。

票数 0
EN

Stack Overflow用户

发布于 2021-01-05 13:51:49

另一个解决办法。与最佳答案不同,您不需要在接收到应用程序的数据时创建categoryColDef。您可以更早地创建它,并且只对objCategoryMappings进行更改。此实现所做的是在从数据库或其他地方接收到应用程序的新数据时,从objCategoryMappings中删除现有元素。当然,您也可以使用push()方法添加新数据,但问题是,每当新数据接收到应用程序时,数组中的旧元素就不会被移除;因此,将新数据添加到已经有旧数据的数组中。我在Firebase也经历过这种情况。我认为这个解决方案使得管理代码变得容易了。

代码语言:javascript
运行
复制
objCategoryMappings = [];

this.categoryCommonService.getEntityData('getallcatgories')
            .subscribe((rowData) => {                 
                this.objCategoryMappings.length = 0;           
                this.objCategoryMappings.push(...rowData);             
            });
            
          
 cellEditor: 'agSelectCellEditor', cellEditorParams: { values: objCategoryMappings}

另一个解决办法。在此解决方案中,它假设rowData和objCategoryMappings的数据位于同一个位置,因此您可以比较相同位置的元素,以查看是否有任何新的更改。如果存在,则在objCategoryMappings中进行更改,而不是替换所有值。这可能是一个非常有效的解决方案。(我没有测试这个解决方案,不像第一个)

代码语言:javascript
运行
复制
objCategoryMappings = [];

this.categoryCommonService.getEntityData('getallcatgories')
  .subscribe((rowData) => {
    this.assign(rowData);           
});


function assign(rowData){
    for(var i=0; i<rowData.length; i++) {
     if (rowData[i] != objCategoryMappings[i]) {
        objCategoryMappings[i] = rowData[i];
     }
  }
}


cellEditor: 'agSelectCellEditor', cellEditorParams: { values: objCategoryMappings}

可以将length属性设置为随时截断数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59315474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档