Descripción general del componente Angular Data Grid

    Angular Data Grid es un componente para mostrar datos en formato tabular. Las cuadrículas modernas son complejas y generalmente incluyen un gran conjunto de funciones como selección de datos, filtrado de estilos de Excel, clasificación, paginación, agrupación, creación de plantillas, movimiento de columnas, fijación de columnas, exportación a Excel, formatos CSV y más.

    Ignite UI Angular Data Grid cubre todas estas funciones básicas de Grid, pero también funciones avanzadas como la edición por lotes, la persistencia de estados, las navegaciones con el teclado y más. Al garantizar una integración perfecta con varias fuentes de datos, nuestro componente ofrece el mejor rendimiento y escalabilidad, lo que lo hace ideal para aplicaciones que manejan grandes conjuntos de datos o aquellas que requieren actualizaciones rápidas en tiempo real.

    Cuadrícula de datos Angular

    Angular Data Grid Example

    Maratón de Boston 2021: en este ejemplo de cuadrícula angular, puede ver cómo los usuarios pueden realizar filtrados básicos y de estilo Excel, clasificación de datos en vivo, así como el uso de resúmenes de cuadrículas y plantillas de celdas que incluyen nuestro componente Sparkline, el componente Indicador de progreso circular. e Iconos. La demostración también incluye paginación personalizada y parte de uso por página de Angular Pagination.

    Getting Started with Ignite UI for Angular Data Grid

    Note

    Este componente puede utilizar el HammerModule opcionalmente. Se puede importar en el módulo raíz de la aplicación para que las interacciones táctiles funcionen como se espera.

    Para comenzar con el componente Ignite UI for Angular Data Grid, primero debe instalar Ignite UI for Angular. En una aplicación Angular existente, escriba el siguiente comando:

    ng add igniteui-angular
    

    Para obtener una introducción completa a la Ignite UI for Angular, lea el tema de introducción.

    El siguiente paso es importar IgxGridModule en su archivo app.module.ts.

    // app.module.ts
    
    import { IgxGridModule } from 'igniteui-angular';
    // import { IgxGridModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        imports: [
            ...
            IgxGridModule,
            ...
        ]
    })
    export class AppModule {}
    

    Alternativamente, a partir de 16.0.0, puede importar IgxGridComponent como una dependencia independiente o usar el token IGX_GRID_DIRECTIVES para importar el componente y todos sus componentes y directivas de soporte.

    // home.component.ts
    
    import { IGX_GRID_DIRECTIVES } from 'igniteui-angular';
    // import { IGX_GRID_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        selector: 'app-home',
        template: '<igx-grid [data]="localData" [autoGenerate]="true"></igx-grid>',
        styleUrls: ['home.component.scss'],
        standalone: true,
        imports: [IGX_GRID_DIRECTIVES]
        /* or imports: [IgxGridComponent] */
    })
    export class HomeComponent {
        public data: Product [];
    }
    

    Ahora que ha importado la Ignite UI for Angular Grid, puede comenzar a usar el componente igx-grid.

    Using the Angular Data Grid

    <igx-grid #grid1 id="grid1" [data]="localData" [autoGenerate]="true"></igx-grid>
    

    La propiedad de datos vincula la cuadrícula, en este caso a una matriz local de objetos.

    La propiedad autoGenerate le dice a igx-grid que genere automáticamente los IgxColumnComponent de la grilla en función de los campos de la fuente de datos. También intentará deducir el tipo de datos apropiado para la columna, si es posible. Los desarrolladores también pueden definir explícitamente las columnas y la asignación a los campos de la fuente de datos.

    Angular Bootstrap Grid Definition

    Ignite UI for Angular incluye una potente cuadrícula de arranque como un sistema de diseño basado en flex. Se espera que cualquier aplicación moderna actual siga un enfoque de diseño web responsivo, lo que significa que puede ajustar elegantemente el diseño de los elementos HTML según el tamaño del dispositivo o simplemente cambiando el tamaño del navegador. Un diseño de cuadrícula de arranque Angular era el enfoque más utilizado en el pasado, pero un sistema de diseño basado en flexibilidad como la cuadrícula CSS se ha vuelto más popular, ya que funciona en cualquier navegador. La Ignite UI for Angular permite el flujo vertical y horizontal, incluido el ajuste, justificación y alineación de contenido/texto. La Ignite UI for Angular grid admite un diseño responsivo mediante CSS, lo que le brinda la máxima flexibilidad en el comportamiento de la cuadrícula al cambiar el tamaño.

    Angular Grid Styling Configuration

    Note

    IgxGridComponent utiliza un diseño de cuadrícula CSS, que no es compatible con IE sin prefijos, por lo que no se representará correctamente.

    En Angular la mayoría de los estilos tienen prefijos implícitos gracias al complemento Autoprefixer.

    Para prefijar diseños de cuadrícula sin embargo, es necesario habilitar el Prefijo automático propiedad de cuadrícula con el comentario /* autoprefixer grid:on */.

    Para facilitar su trabajo, aplique el comentario en el archivo src/styles.scss.

    // src/styles.scss
    @use "igniteui-angular/theming" as *;
    
    // IMPORTANT: Prior to Ignite UI for Angular version 13 use:
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    @include core();
    /* autoprefixer grid:on */
    @include theme($default-palette);
    

    Editable Grid Angular

    Cada operación para la edición de cuadrícula Angular incluye operaciones por lotes, lo que significa que la API le brinda la opción de agrupar las ediciones en una única llamada al servidor, o puede realizar operaciones de edición/actualización de cuadrícula a medida que ocurren con las interacciones de la cuadrícula. Además de una excelente experiencia para desarrolladores como cuadrícula Angular editable con operaciones CRUD, la cuadrícula Angular incluye navegación con teclado similar a Excel. Se incluye navegación de cuadrícula predeterminada común, además de la opción de anular cualquier opción de navegación para satisfacer las necesidades de sus clientes. Una cuadrícula editable en Angular con un excelente esquema de navegación es fundamental para cualquier aplicación de línea de negocio moderna; con la cuadrícula Ignite UI lo hacemos fácil.

    Después de este tema, aprenderá más sobre la plantilla de celdas y la plantilla de edición de celdas y la edición.

    Angular Grid Column Configuration

    IgxColumnComponent se utiliza para definir la colección columns de la cuadrícula y para habilitar funciones por columna como clasificación y filtrado. También se encuentran disponibles plantillas de celdas, encabezados y pies de página.

    Defining Columns

    Desactivemos la propiedad autoGenerate y definamos la colección de columnas en el marcado:

    <igx-grid #grid1 [data]="data | async" [autoGenerate]="false" (columnInit)="initColumns($event)"
        (selected)="selectCell($event)" [allowFiltering]="true">
        <igx-column field="Name" [sortable]="true" header=" "></igx-column>
        <igx-column field="AthleteNumber" [sortable]="true" header="Athlete number" [filterable]="false"></igx-column>
        <igx-column field="TrackProgress" header="Track progress" [filterable]="false">
            <ng-template igxCell let-value>
                <igx-linear-bar [stripped]="false" [value]="value" [max]="100"></igx-linear-bar>
            </ng-template>
        </igx-column>
        <igx-paginator [perPage]="6">
        </igx-paginator>
    </igx-grid>
    

    Se puede crear una plantilla para cada una de las columnas de la cuadrícula por separado. La columna espera directivas del módulo de cuadrícula Angular ng-template.

    También expone entradas additionalTemplateContext que se pueden usar para propiedades personalizadas y cualquier tipo de contexto de datos que desee pasar a la columna misma:

    <igx-column [additionalTemplateContext]="contextObject">
        <ng-template igxCell let-cell="cell" let-props="additionalTemplateContext">
            {{ props.firstProperty }}
        </ng-template>
    </igx-column>
    
    public contextObject = { firstProperty: 'testValue', secondProperty: 'testValue1'};
    

    Header Template

    igxHeader apunta al encabezado de la columna proporcionando como contexto el propio objeto de la columna.

    ...
    <igx-column field="Name">
        <ng-template igxHeader let-column>
            {{ column.field | uppercase }}
        </ng-template>
    </igx-column>
    ...
    
    Note

    Siempre que se utiliza una plantilla de encabezado junto con la funcionalidad de agrupar/mover, el área del encabezado de la columna se puede arrastrar y no se puede acceder a la parte de elementos personalizados de la plantilla de encabezado hasta que los marque como no arrastrables. Ejemplo a continuación.

    <igx-column #col field="ProductName" header="Product Name"
        [groupable]="true" [hasSummary]="true">
        <ng-template igxHeader let-col>
            <div class="text">{{col.field}}</div>
            <igx-icon (click)="toggleSummary(col)" [attr.draggable]="false">functions
            </igx-icon>
        </ng-template>
    </igx-column>
    

    Como puede ver, estamos agregando un atributo arrastrable establecido en false.

    Cell Template

    igxCell aplica la plantilla proporcionada a todas las celdas de la columna. El objeto de contexto proporcionado en la plantilla consta del valor de celda proporcionado implícitamente y el propio objeto de celda. Se puede utilizar para definir una plantilla donde las celdas pueden crecer según su contenido, como en el siguiente ejemplo.

    ...
    <igx-column field="Name">
        <ng-template igxCell let-value>
            {{ value | titlecase }}
        </ng-template>
    </igx-column>
    ...
    

    En el fragmento anterior "tomamos" una referencia al valor de celda proporcionado implícitamente. Esto es suficiente si solo desea presentar algunos datos y tal vez aplicar algún estilo personalizado o transformaciones de canalización sobre el valor de la celda. Sin embargo, aún más útil es tomar la instancia CellType como se muestra a continuación:

    <igx-grid #grid [data]="data">
        <igx-column dataType="string" field="Name">
            <ng-template igxCell let-cell="cell">
                <!-- Implement row deleting inside the cell template itself -->
                <span tabindex="0" (keydown.delete)="grid.deleteRow(cell.row.index)">{{ cell.value | titlecase }}</span>
            </ng-template>
        </igx-column>
        <igx-column dataType="boolean" field="Subscribtion">
            <ng-template igxCell let-cell="cell">
                <!-- Bind the cell value through the ngModel directive and update the data source when the value is changed in the template -->
                <input type="checkbox" [ngModel]="cell.value" (ngModelChange)="cell.update($event)" />
            </ng-template>
        </igx-column>
    <igx-grid>
    

    Al cambiar datos a través de la plantilla de celda usando ngModel, debe llamar a los métodos API apropiados para asegurarse de que el valor se actualice correctamente en la recopilación de datos subyacente de la cuadrícula Angular. En el fragmento anterior, la llamada ngModelChange pasa a través de la API de edición de la grilla y pasa por el proceso de edición de la grilla, activando adecuadamente las transacciones (si corresponde) y manejando resúmenes, selecciones, etc. Sin embargo, este ngModelChange se activará cada vez que el valor del cambios de celda, no solo cuando el usuario termina de editar, lo que genera muchas más llamadas a la API.

    Note

    La cuadrícula expone un manejo predeterminado para tipos de columnas numéricas, de cadena, de fecha y booleanas. Por ejemplo, la columna mostrará un ícono check o close, en lugar de verdadero/falso de forma predeterminada, para el tipo de columna booleana.

    Si los datos de una celda están vinculados con [(ngModel)] y el cambio de valor no se maneja, el nuevo valor no se actualizará correctamente en la fuente de datos subyacente de la cuadrícula Angular. Cuando se trata de editar celdas con una plantilla personalizada, se recomienda encarecidamente utilizar la plantilla de edición de celdas de la celda.

    Cuando se implementa correctamente, la plantilla de edición de celda también garantiza que el editValue de la celda pasará correctamente por el ciclo de eventos de edición de la cuadrícula.

    Cell Editing Template

    La columna también acepta una última plantilla que se utilizará cuando una celda esté en modo de edición. Al igual que con las otras plantillas de columnas, el objeto de contexto proporcionado es nuevamente el valor de la celda y el objeto de la celda en sí. Por supuesto, para que la plantilla en modo de edición sea accesible para los usuarios finales, debe establecer la propiedad editable de IgxColumnComponent en true.

    <igx-column dataType="number" editable="true" field="Price">
        <ng-template igxCellEditor let-cell="cell">
            <label for="price">
                Enter the new price tag
            </label>
            <input name="price" type="number" [(ngModel)]="cell.editValue" />
        </ng-template>
    </igx-column>
    

    Asegúrese de verificar la API de CellType para acostumbrarse a las propiedades proporcionadas que puede usar en sus plantillas.

    Column Template API

    Cada una de las plantillas de columna se puede cambiar mediante programación en cualquier momento a través del propio objeto IgxColumnComponent. Por ejemplo, en el código siguiente, hemos declarado dos plantillas para nuestros datos de usuario. En nuestro código TypeScript obtendremos referencias a las plantillas mismas y luego, según alguna condición, representaremos la plantilla apropiada para la columna en nuestra aplicación.

    <igx-grid>
        <!-- Column declarations -->
    </igx-grid>
    
    <ng-template #normalView let-value>
        <div class="user-details">{{ val }}</div>
        <user-details-component></user-details-component>
    </ng-template>
    
    <ng-template #smallView let-value>
        <div class="user-details-small">{{ val }}</div>
    </ng-template>
    
    @ViewChild("normalView", { read: TemplateRef })
    public normalView: TemplateRef<any>;
    
    @ViewChild("smallView", { read: TemplateRef })
    public smallView: TemplateRef<any>;
    
    ....
    
    const column = this.grid.getColumnByName("User");
    // Return the appropriate template based on some conditiion.
    // For example saved user settings, viewport size, etc.
    column.bodyTemplate = this.smallView;
    

    Las propiedades de las columnas también se pueden establecer en el código del evento columnInit que se emite cuando las columnas se inicializan en la cuadrícula.

    public initColumns(column: IgxGridColumn) {
        const column: IgxColumnComponent = column;
        if (column.field === 'ProductName') {
            column.sortable = true;
            column.editable = true;
        }
    }
    

    El código anterior hará que la columna ProductName se pueda ordenar y editar y creará una instancia de la interfaz de usuario de las funciones correspondientes (como entradas para editar, etc.).

    Custom Display Format

    Todos los valores de una columna de fecha, numérico, moneda y porcentaje se transforman a través de Angular DatePipe, DecimalPipe, CurrencyPipe y PercentPipe en consecuencia. Esto no modifica el valor original, solo el valor que se muestra en la columna. Por lo tanto, tenga en cuenta que todas las operaciones y manipulaciones de datos se realizan en función de los valores de su fuente de datos. De forma predeterminada, los valores se mostrarán según la locale de la cuadrícula (si no se especifica, recurre a la configuración regional de la aplicación, que de forma predeterminada es 'en-US').

    Consulte Configurar la configuración regional de su aplicación para obtener más detalles.

    Además, existen parámetros opcionales para formatear:

    • format: determina qué partes de fecha/hora se muestran, el valor predeterminado es 'mediumDate', equivalente a 'MMM d, y'
    • timezone: el desplazamiento de la zona horaria para las fechas. De forma predeterminada utiliza la zona horaria del sistema local del usuario final.
    • digitsInfo: objetos de representación decimal. Por defecto es '1.0-3'

    Para permitir personalizar el formato de visualización mediante estos parámetros, se expone la entrada pipeArgs. Una columna respetará solo las propiedades correspondientes para su tipo de datos, si se establece pipeArgs. Ejemplo:

    const pipeArgs: IColumnPipeArgs = {
         format: 'longDate',
         timezone: 'UTC',
         digitsInfo: '1.1-2'
    }
    
    <igx-column field="OrderDate" dataType="date" [pipeArgs]="pipeArgs"></igx-column>
    <igx-column field="UnitPrice" dataType="number" [pipeArgs]="pipeArgs"></igx-column>
    

    La columna OrderDate respetará solo las propiedades format y timezone, mientras que UnitPrice solo respetará digitsInfo. Para obtener más detalles, consulte la documentación oficial Angular en Localización de su aplicación.

    Todos los tipos de datos de columna disponibles se pueden encontrar en el tema oficial Tipos de columna.

    Angular Grid Data Structure

    IgxGridComponent maneja datos planos y POJO anidados (objetos Java antiguos y simples). La estructura de datos específica para la representación tiene la forma:

    const OBJECT_ARRAY = [{
            ObjectKey1: value1,
            ObjectKey2: value2,
            .
            .
            .
            ObjectKeyN: valueN
        },
        .
        .
        .
      }];
    
    const POJO = [{
            ObjectKey1: value1,
            ObjectKey2: value2,
            .
            .
            .
            ObjectKeyN: {
              ObjectKeyN1: value1,
              ObjectKeyN2: value2,
              .
              .
              .
              ObjectKeyNM: valueNM,
            }
        },
        .
        .
        .
      }];
    
    
    Warning

    Los valores clave no deben contener matrices.

    Si utiliza columnas autoGenerate,​ ​las claves de datos deben ser idénticas.

    Angular Grid Data Binding

    Antes de continuar con la cuadrícula, queremos cambiar la cuadrícula Angular para vincularla al servicio de datos remoto, que es el escenario común en aplicaciones a gran escala. Una buena práctica es separar toda la lógica relacionada con la recuperación de datos en un servicio de datos independiente, por lo que crearemos un servicio que se encargará de la recuperación de datos del servidor.

    Implementemos nuestro servicio en un archivo separado.

    // northwind.service.ts
    
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import { Observable } from 'rxjs/Observable';
    import { of } from 'rxjs/observable/of';
    import { catchError, map } from 'rxjs/operators';
    

    Estamos importando el decorador Injectable, que es un ingrediente esencial en cada definición de servicio Angular. HttpClient nos proporcionará la funcionalidad para comunicarnos con los servicios backend. Devuelve un Observable de algún resultado al que nos suscribiremos en nuestro componente de grilla.

    Nota: antes de Angular 5 HttpClient estaba ubicado en @angular/http y se llamaba Http.

    Dado que recibiremos una respuesta JSON que contiene una serie de registros, también podemos ayudarnos especificando qué tipo de datos esperamos que se devuelvan en el observable definiendo una interfaz con la forma correcta. Siempre se recomienda la verificación de tipos y puede ahorrarle algunos dolores de cabeza en el futuro.

    // northwind.service.ts
    
    export interface NorthwindRecord {
        ProductID: number;
        ProductName: string;
        SupplierID: number;
        CategoryID: number;
        QuantityPerUnit: string;
        UnitPrice: number;
        UnitsInStock: number;
        UnitsOnOrder: number;
        ReorderLevel: number;
        Discontinued: boolean;
        CategoryName: string;
    }
    

    El servicio en sí es bastante simple y consta de un método: fetchData que devolverá un Observable<NorthwindRecord[]>. En los casos en que la solicitud falla por cualquier motivo (servidor no disponible, error de red, etc.), HttpClient devolverá un error. Aprovecharemos el operador catchError que intercepta un Observable que falló y pasa el error a un controlador de errores. Nuestro controlador de errores registrará el error y devolverá un valor seguro.

    // northwind.service.ts
    
    @Injectable()
    export class NorthwindService {
        private url = 'http://services.odata.org/V4/Northwind/Northwind.svc/Alphabetical_list_of_products';
    
        constructor(private http: HttpClient) {}
    
        public fetchData(): Observable<NorthwindRecord[]> {
            return this.http
                .get(this.url)
                .pipe(
                    map(response => response['value']),
                    catchError(
                        this.errorHandler('Error loading northwind data', [])
                    )
                );
        }
    
        private errorHandler<T>(message: string, result: T) {
            return (error: any): Observable<any> => {
                console.error(`${message}: ${error.message}`);
                return of(result as T);
            };
        }
    }
    

    Asegúrese de importar tanto HttpClientModule como nuestro servicio en el módulo de la aplicación y registrar el servicio como proveedor.

    // app.module.ts
    
    import { HttpClientModule } from '@angular/common/http';
    ...
    import { NorthwindService } from './northwind.service';
    
    @NgModule({
        imports: [
            ...
            HttpClientModule
            ...
        ],
        providers: [
            NorthwindService
        ]
    })
    export class AppModule {}
    

    Después de implementar el servicio, lo inyectaremos en el constructor de nuestro componente y lo usaremos para recuperar los datos. El enlace del ciclo de vida ngOnInit es un buen lugar para enviar la solicitud inicial.

    Nota: en el código siguiente, es posible que se pregunte por qué configuramos la propiedad de registros en una matriz vacía antes de suscribirnos al servicio. La solicitud Http es asincrónica y, hasta que se complete, la propiedad de registros​ ​no estará definida, lo que generará un error cuando la cuadrícula intente vincularse a ella. Debe inicializarlo con un valor predeterminado o utilizar un BehaviorSubject.

    // my.component.ts
    
    @Component({...})
    export class MyComponent implements OnInit {
    
        public records: NorthwindRecord[];
    
        constructor(private northwindService: NorthwindService) {}
    
        ngOnInit() {
            this.records = [];
            this.northwindService.fetchData().subscribe((records) => this.records = records);
        }
    }
    

    y en la plantilla del componente:

        <igx-grid [data]="records">
            <igx-column field="ProductId"></igx-column>
            <!-- rest of the column definitions -->
            ...
        </igx-grid>
    

    Nota: Por ahora, es mejor evitar la propiedad grid autoGenerate al vincular datos remotos. Se supone que los datos están disponibles para inspeccionarlos y generar las columnas apropiadas. Por lo general, este no es el caso hasta que el servicio remoto responde y la red arroja un error. Hacer que autoGenerate esté disponible, cuando se vincula al servicio remoto, está en nuestra hoja de ruta para versiones futuras.

    Complex Data Binding

    IgxGridComponent admite la vinculación a objetos complejos (incluido el anidamiento a más de un nivel) a través de una "ruta" de propiedades en el registro de datos.

    Eche un vistazo al siguiente modelo de datos:

    interface AminoAcid {
        name: string;
        abbreviation: {
            short: string;
            long: string;
        }
        weight: {
            molecular: number;
            residue: number;
        },
        formula: {
            molecular: string;
            residue: string;
        }
        ...
    }
    

    Por ejemplo, para mostrar los pesos de un aminoácido dado en la cuadrícula, bastará con el siguiente fragmento

    <igx-column field="weight.molecular"></igx-column>
    <igx-column field="weight.residue"></igx-column>
    

    Consulte el ejemplo a continuación para obtener información adicional. Este tipo de enlace admite todas las funciones predeterminadas que esperaría de la cuadrícula. Es decir, todas las operaciones de clasificación y filtrado funcionan de inmediato sin ninguna configuración adicional. Lo mismo ocurre con las operaciones de agrupación y edición con o sin transacciones, así como con la capacidad de crear plantillas para las celdas de la columna enlazada.

    Warning

    Las grillas no admiten este tipo de enlace para las propiedades primary key, foreign key y child key cuando corresponda.

    Una forma alternativa de vincular datos complejos o visualizar datos compuestos (de más de una columna) en IgxGrid es utilizar una plantilla de cuerpo personalizada para la columna. Generalmente, uno puede: - usar el value de la celda que contiene los datos anidados - usar el objeto cell en la plantilla, desde el cual acceder a row.data y, por lo tanto, recuperar cualquier valor de él, es decir, cell.row.data[field] y cell.row.data[field][nestedField]

    e interpolar los de la plantilla.

    <igx-column field="abbreviation.long" header="Long">
        <ng-template igxCell let-cell="cell">
            <div>
                <div>
                    {{ cell.value }}
                    {{ cell.row.data['name'] }}  
                    {{ cell.row.data['weight']['molecular'] }}
                </div>
            </div>
        </ng-template>
    </igx-column>
    

    A continuación se muestran los datos que vamos a utilizar:

    export const EMPLOYEE_DATA = [
        {
            Age: 55,
            Employees: [
                {
                    Age: 43,
                    HireDate: new Date(2011, 6, 3),
                    ID: 3,
                    Name: "Michael Burke",
                    Title: "Senior Software Developer"
                },
                {
                    Age: 29,
                    HireDate: new Date(2009, 6, 19),
                    ID: 2,
                    Name: "Thomas Anderson",
                    Title: "Senior Software Developer"
                },
                {
                    Age: 31,
                    HireDate: new Date(2014, 8, 18),
                    ID: 11,
                    Name: "Monica Reyes",
                    Title: "Software Development Team Lead"
                },
                {
                    Age: 35,
                    HireDate: new Date(2015, 9, 17),
                    ID: 6,
                    Name: "Roland Mendel",
                    Title: "Senior Software Developer"
                }],
            HireDate: new Date(2008, 3, 20),
            ID: 1,
            Name: "John Winchester",
            Title: "Development Manager"
        },
    ...
    

    La plantilla personalizada para la columna, que representará los datos anidados:

    ...
     <igx-column field="Employees" header="Employees" [cellClasses]="{ expand: true }" width="40%">
            <ng-template #nestedDataTemp igxCell let-people let-cell="cell">
                <div class="employees-container">
                    <igx-expansion-panel *ngFor="let person of people">
                        <igx-expansion-panel-header iconPosition="right">
                            <igx-expansion-panel-description>
                                {{ person.Name }}
                            </igx-expansion-panel-description>
                        </igx-expansion-panel-header>
                        <igx-expansion-panel-body>
                            <div class="description">
                                <igx-input-group (keydown)="stop($event)" style="--ig-size: var(--ig-size-small)">
                                    <label igxLabel for="title">Title</label>
                                    <input type="text" name="title" igxInput [(ngModel)]="person.Title" style="text-overflow: ellipsis;" />
                                </igx-input-group>
                                <igx-input-group (keydown)="stop($event)" style="--ig-size: var(--ig-size-small); width: 15%;">
                                    <label igxLabel for="age">Age</label>
                                    <input type="number" name="age" igxInput [(ngModel)]="person.Age" />
                                </igx-input-group>
                            </div>
                        </igx-expansion-panel-body>
                    </igx-expansion-panel>
                </div>
            </ng-template>
     </igx-column>
    ...
    

    Y el resultado de esta configuración es:

    Working with Flat data

    El enfoque de enlace de datos planos es similar al que ya describimos anteriormente, pero en lugar del valor de la celda usaremos la propiedad data de IgxGridRow.

    Dado que la cuadrícula Angular es un componente para representar, manipular y preservar registros de datos, tener acceso a cada registro de datos le brinda la oportunidad de personalizar el enfoque para manejarlo. La propiedad data le brinda esta oportunidad.

    A continuación se muestran los datos que vamos a utilizar:

    export const DATA: any[] = [
        {
            Address: "Obere Str. 57",
            City: "Berlin",
            CompanyName: "Alfreds Futterkiste",
            ContactName: "Maria Anders",
            ContactTitle: "Sales Representative",
            Country: "Germany",
            Fax: "030-0076545",
            ID: "ALFKI",
            Phone: "030-0074321",
            PostalCode: "12209",
            Region: null
        },
    ...
    ]
    

    La plantilla personalizada:

    ...
    <igx-column field="Address" header="Address" width="25%" editable="true">
        <ng-template #compositeTemp igxCell let-cell="cell">
            <div class="address-container">
            // In the Address column combine the Country, City and PostCode values of the corresponding data record
                <span><strong>Country:</strong> {{cell.row.data.Country}}</span>
                <br/>
                <span><strong>City:</strong> {{cell.row.data.City}}</span>
                <br/>
                <span><strong>Postal Code:</strong> {{cell.row.data.PostalCode}}</span>
            </div>
        </ng-template>
    </igx-column>
    

    Tenga en cuenta que con la plantilla definida anteriormente no podrá realizar operaciones de edición, por lo que necesitamos una plantilla de editor.

    <igx-column field="Address" header="Address" width="25%" editable="true">
        <ng-template  igxCellEditor let-cell="cell">
            <div class="address-container">
                <span>
                    <strong>Country:</strong> {{cell.row.data.Country}}
                    <igx-input-group width="100%">
                            <input igxInput [(ngModel)]="cell.row.data.Country" />
                    </igx-input-group>
                </span>
                <br/>
                <span><strong>City:</strong> {{cell.row.data.City}}</span>
                <igx-input-group width="100%">
                        <input igxInput [(ngModel)]="cell.row.data.City" />
                </igx-input-group>
                <br/>
                <span><strong>Postal Code:</strong> {{cell.row.data.PostalCode}}</span>
                <igx-input-group width="100%">
                        <input igxInput [(ngModel)]="cell.row.data.PostalCode" />
                </igx-input-group>
            </div>
        </ng-template>
    </igx-column>
    ...
    

    Y el resultado es:

    Keyboard Navigation

    La navegación con el teclado de Grid proporciona una rica variedad de interacciones con el teclado para el usuario. Mejora la accesibilidad y permite la navegación intuitiva a través de cualquier tipo de elementos internos (celda, fila, encabezado de columna, barra de herramientas, pie de página, etc.). Consulte estos recursos para obtener más información:

    Persistencia de estado

    Lograr un marco de persistencia de estado es más fácil que nunca utilizando la nueva directiva IgxGridState incorporada.

    Dimensionamiento

    Consulte el tema Tamaño de la cuadrícula.

    Performance (Experimental)

    El diseño de IgxGridComponent le permite aprovechar la función Event Coalescing que ha introducido Angular. Esta característica permite un rendimiento mejorado con aproximadamente un 20% en términos de interacciones y capacidad de respuesta. Esta característica se puede habilitar a nivel de aplicación simplemente configurando las propiedades ngZoneEventCoalescing y ngZoneRunCoalescing en true en el método bootstrapModule:

    platformBrowserDynamic()
      .bootstrapModule(AppModule, { ngZoneEventCoalescing: true, ngZoneRunCoalescing: true })
      .catch(err => console.error(err));
    
    Note

    Esto todavía se encuentra en una función experimental para IgxGridComponent. Esto significa que puede haber algunos comportamientos inesperados en el Grid. En caso de encontrar algún comportamiento de este tipo, contáctenos en nuestra página de Github.

    Note

    Habilitarlo puede afectar otras partes de una aplicación Angular con las que IgxGridComponent no está relacionado.

    Known Limitations

    Limitación Descripción
    Anchos de columna establecidos enpercentage ypx Actualmente no admitimos la combinación de anchos de columna con% ypx.
    Al intentar filtrar una columna de tiponumber Si un valor diferente anumber se ingresa en la entrada de filtrado,NaN se devuelve debido a una conversión incorrecta.
    Grid width does not depend on the column widths Elwidth de todas las columnas no determina la extensión de la cuadrícula en sí. Está determinado por las dimensiones del contenedor principal o por las dimensiones de la cuadrícula definida.width.
    Cuadrícula anidada en el contenedor principal Cuando la cuadrículawidth no está configurado y se coloca en un contenedor principal con dimensiones definidas, la cuadrícula se extiende hasta este contenedor.
    RedOnPush Estrategia de detección de cambios La red opera conChangeDetectionStrategy.OnPush Entonces, cada vez que aparezca alguna personalización, asegúrese de que se notifique a la cuadrícula sobre los cambios que ocurren.
    Las columnas tienen un ancho de columna mínimo permitido. Dependiendo del valor de [--ig-size] variable CSS, son los siguientes:
    "pequeño": 56px
    "medio": 64px
    "grande ": 80px
    Si se establece un ancho inferior al mínimo permitido, no afectará a los elementos renderizados. Se renderizarán con el ancho mínimo permitido para el correspondiente [--ig-size]. Esto puede provocar un comportamiento inesperado con la virtualización horizontal y, por lo tanto, no es compatible.
    El alto de la fila no se ve afectado por el alto de las celdas que no se representan actualmente a la vista. Debido a la virtualización, una columna con una plantilla personalizada (que cambia la altura de la celda) que no está en la vista no afectará la altura de la fila. La altura de la fila se verá afectada solo mientras la columna relacionada se desplaza en la vista.
    Note

    igxGrid usa la directiva igxForOf internamente, por lo tanto, todas las limitaciones igxForOf son válidas para igxGrid. Para obtener más detalles, consulte la sección Problemas conocidos de igxForOf.

    API References

    Theming Dependencies

    Tutorial video

    Obtenga más información sobre cómo crear una cuadrícula de datos Angular en nuestro breve video tutorial:

    Additional Resources

    Nuestra comunidad es activa y siempre da la bienvenida a nuevas ideas.