首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用onClick激发绘制角分量动态生成网格

用onClick激发绘制角分量动态生成网格
EN

Stack Overflow用户
提问于 2021-08-12 14:00:39
回答 2查看 853关注 0票数 0

我正在制作一个devExpress网格的可重用组件。下面的代码是可重用组件(正在制作中)和使用它的父组件。

问题(目前为止)

  1. 列和按钮是使用ngFor动态添加的。当行呈现时,会发生按钮的onClick事件,我做错了什么,或者如何阻止它?
  2. 可以添加属性成为可选的,例如,在列中,如果它是按钮行,只需要添加属性'type‘。在角度上,使其为空,类似于type="value?‘:null“,但这似乎不起作用。

代码语言:javascript
复制
parent component html
<core-table-dev-express [dataSource$]="dataSource$" [columns]="columns2" [enableBatchEdit]="true"></core-table-dev-express>
代码语言:javascript
复制
parent component ts
   //data from server 
   public dataSource$: Observable<Container[]>;
   
   //columns for grid
   public columns2: dxColumn[] = [
        { caption: 'Title', dataField: 'title' },
        { caption: 'Id', dataField: 'id', dataType: 'number' },
        {
            type: "buttons", 
            caption: 'Actions',
            buttons: [{
                text: 'Foo',
                parentClassObject: this.alertMe
            },
            {
                text: 'Bar',
                parentClassObject: this.alertMe
            }]
        }
    ]
代码语言:javascript
复制
grid component html

        <dx-data-grid id="gridContainer1"
                      [dataSource]="dataSource$ | async"
                      keyExpr="id"
                      [repaintChangesOnly]="true"
                      [columnHidingEnabled]="true"
                      [columnAutoWidth]="true"
                      [showBorders]="true"
                      [showColumnLines]="true"
                      [showRowLines]="true"
                      [rowAlternationEnabled]="true"
                      [allowColumnReordering]="false"
                      [allowColumnResizing]="false">
            <dxo-load-panel [enabled]="true"></dxo-load-panel>
            <dxo-column-fixing [enabled]="true"></dxo-column-fixing>
            <dxo-column-chooser [enabled]="true" mode="select"></dxo-column-chooser>
            <dxo-state-storing [enabled]="true" type="localStorage" storageKey="storage"></dxo-state-storing>
            <dxo-search-panel [visible]="true"></dxo-search-panel>
            <dxo-filter-row [visible]="true"></dxo-filter-row>
            <dxo-group-panel [visible]="true"></dxo-group-panel>
            <dxo-scrolling rowRenderingMode="virtual"></dxo-scrolling>
            <dxo-paging [pageSize]="gridDefaultPagesize"></dxo-paging>
            <dxo-pager [showPageSizeSelector]="true"
                       [allowedPageSizes]="[15,25,100]"
                       [showInfo]="true"
                       [visible]="true">
            </dxo-pager>

            <dxo-editing *ngIf='enableBatchEdit' mode="batch"
                         [allowUpdating]="true"
                         [allowAdding]="true"
                         [allowDeleting]="true"
                         [selectTextOnEditStart]="true">
            </dxo-editing>

            <dxi-column *ngFor="let col of columns"
                        dataField="{{col.dataField}}"
                        caption="{{col.caption}}"
                        dataType="{{col.dataType}}"
                        type="{{col.type}}">     <!-- can type be conditionally set? -->
                    <dxi-button *ngFor="let b of col.buttons"
                                text="{{b.text}}"
                                hint="{{b.hint}}"
                                cssClass="{{b.cssClass}}"
                                icon="{{b.icon}}"
                                [onClick]="click($event,b)"
                                >
                    </dxi-button>
            </dxi-column>

        </dx-data-grid>
代码语言:javascript
复制
grid component ts

import {
    Component, Input, ChangeDetectionStrategy, AfterContentInit,
    EventEmitter, Output, OnDestroy, ViewChild, ChangeDetectorRef, NgZone, OnInit
} from "@angular/core";
import { dxColumn } from './../interfaces/table.interfaces';
import DataSource from 'devextreme/data/data_source';
import ODataStore from 'devextreme/data/odata/store';
import { Observable } from 'rxjs';

@Component({
    selector: 'core-table-dev-express',
    templateUrl: './table-dev-express.component.html',
    styleUrls: ['./table-dev-express.component.scss'],
})
export class TableDevExpressComponent {
    // Shared Variables
    public gridDefaultPagesize = 5;

    @Input() dataSource$: Observable<any>;
    @Input() columns: dxColumn[];
    @Input() enableBatchEdit: boolean;
    @Output() parentMethod = new EventEmitter<any>();

    click = function(e,b) {
        this.parentMethod.emit(b.parentClassObject(e)); // need to send back row data
    }


}
EN

回答 2

Stack Overflow用户

发布于 2021-08-12 14:17:08

type="{{ condition ? expressionIfTrue : expressionIfFalse }}"

票数 0
EN

Stack Overflow用户

发布于 2021-08-12 19:06:44

我使用了模板特性并创建了自己的html,而不是使用dxi按钮。

我还想出了如何调用父方法,而不是最漂亮的代码。

传入的父对象:

代码语言:javascript
复制
public columns2: dxColumn[] = [
        { caption: 'Title', dataField: 'title' },
        { caption: 'Id', dataField: 'id', dataType: 'number' },
        {
            caption: 'Actions',
            buttons: [{
                text: 'Edit',
                cssClass: "btn btn-primary btn-sm",
                clickMethodName: "routerTo",
                parentClassObject: this
            },
            {
                text: 'Clone',
                cssClass: "btn btn-primary btn-sm",
                clickMethodName: "cloneContainer",
                parentClassObject: this
            }]
        }
    ]

共享组件的Html

代码语言:javascript
复制
     <dxi-column *ngFor="let col of columns"
                            dataField="{{col.dataField}}"
                            caption="{{col.caption}}"
                            dataType="{{col.dataType}}"
                            type="{{col.buttons ? 'buttons': null}}">
    
                    <dxi-button template="rowButtons">
                        <div class="btn-group" *dxTemplate="let data of 'rowButtons'">
                            <div *ngFor="let b of col.buttons">
                                <button class="{{b.cssClass}}" (click)="click(data,b)">{{b.text}}</button>
                            </div>
                        </div>
                    </dxi-button>
                </dxi-column>

共享组件的类型记录代码

代码语言:javascript
复制
click = function (row, button) {
       this.parentMethod.emit(button.parentClassObject[button.clickMethodName](row.data))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68758900

复制
相关文章

相似问题

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