Estilo condicional de cuadrícula jerárquica Angular

    Si necesita proporcionar algún estilo personalizado en el componente IgxHierarchicalGrid, puede hacerlo a nivel de fila o de celda.

    Hierarchical Grid Conditional Row Styling

    El componente IgxHierarchicalGrid de Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a las filas en función de reglas personalizadas.

    • By setting rowClasses input on the IgxHierarchicalGrid component;
    • By setting rowStyles input on the IgxHierarchicalGrid component;

    Más adelante en este tema los cubriremos con más detalle.

    Using rowClasses

    You can conditionally style the IgxHierarchicalGrid rows by setting the rowClasses input and define custom rules.

    <igx-hierarchical-grid  #hierarchicalGrid class="hgrid" [data]="localData" [height]="'580px'" [width]="'100%'" [rowStyles]="rowStyles">
        ...
    </igx-hierarchical-grid>
    

    LarowClasses entrada acepta un literal objeto que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de callback que devuelve un valor booleano o booleano.

    // sample.component.ts
    
    public rowClasses = {
      activeRow: this.activeRowCondition
    };
    
    public activeRowCondition = (row: RowType) => this.grid?.navigation.activeNode?.row === row.index;
    
    // sample.component.scss
    
    ::ng-deep {
     .activeRow {
      border: 2px solid #fc81b8;
      border-left: 3px solid #e41c77;
     }
    }
    
    Note

    Usa::ng-deep oViewEncapsulation.None forzar los estilos personalizados hacia abajo a través del componente actual y sus hijos.

    Demo

    Using rowStyles

    Las columnas ahora exponen larowStyles propiedad que permite el estilizado condicional de las filas de datos. De forma similar arowClasses acepta un literal objeto donde las claves son propiedades de estilo y los valores son expresiones para su evaluación. Además, puedes aplicar peinado normal (sin condiciones).

    La firma de callback para ambosrowStyles yrowClasses es:

    (row: RowType) => boolean
    

    Definamos nuestros estilos:

    // component.ts
    public rowStyles = {
        background:(row: RowType) => row.data['HasGrammyAward'] ? '#eeddd3' : '#f0efeb',
        'border-left': (row: RowType) => row.data['HasGrammyAward'] ? '2px solid #dda15e' : null
    };
    
    public childRowStyles = {
        'border-left': (row: RowType) => row.data['BillboardReview'] > 70 ? '3.5px solid #dda15e' : null
    };
    
    <igx-hierarchical-grid  #hierarchicalGrid [data]="localdata" [autoGenerate]="false"
            [height]="'580px'" [width]="'100%'" [rowStyles]="rowStyles">
            <igx-row-island [key]="'Albums'" [autoGenerate]="false" [rowStyles]="childRowStyles">
                 ...
            </igx-row-island>  
        ...
    </igx-hierarchical-grid>
    

    Demo

    Hierarchical Grid Conditional Cell Styling

    Descripción general

    El componente IgxHierarchicalGrid de Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a las celdas en función de reglas personalizadas.

    • Estableciendo laIgxColumnComponent entradacellClasses a un literal de objeto que contiene pares clave-valor. La clave es el nombre de la clase CSS, mientras que el valor es una función de callback que devuelve un valor booleano o booleano. El resultado es un diseño material conveniente de la célula.
    // component.ts file
    public beatsPerMinuteClasses = {
        downFont: this.downFontCondition,
        upFont: this.upFontCondition
    };
    ...
    
    private downFontCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] <= 95;
    }
    
    // component.scss file
    .upFont {
      color: red;
    }
    
    .downFont {
      color: green;
    }
    

    Using cellClasses

    You can conditionally style the IgxHierarchicalGrid cells by setting the IgxColumnComponent cellClasses input and define custom rules.

    <!-- sample.component.html -->
    <igx-column field="GrammyNominations" header="Grammy Nominations" dataType="number" [cellClasses]="grammyClasses"></igx-column>
    

    LacellClasses entrada acepta un literal objeto que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de callback que devuelve un valor booleano o booleano.

    // sample.component.ts
    
    private upGrammyCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] > 5;
    }
    
    private downGrammyCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] <= 5;
    }
    
    public grammyClasses = {
        downGrammy: this.downPriceCondition,
        upGrammy: this.upPriceCondition
    };
    
    // sample.component.scss
    
    ::ng-deep {
        .upGrammy {
            color: red;
        }
    
        .downGrammy {
            color: green;
        }
    }
    
    Note

    Usa::ng-deep oViewEncapsulation.None forzar los estilos personalizados hacia abajo a través del componente actual y sus hijos.

    Demo

    • Usando laIgxColumnComponent entradacellStyles que acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para su evaluación.
    public styles = {
        'background': 'linear-gradient(180deg, #dd4c4c 0%, firebrick 100%)',
        'text-shadow': '1px 1px 2px rgba(25,25,25,.25)',
        'animation': '0.25s ease-in-out forwards alternate popin'
    };
    

    La firma de callback para amboscellStyles ycellClasses ahora se ha cambiado a:

    (rowData: any, columnKey: string, cellValue: any, rowIndex: number) => boolean
    

    Using cellStyles

    Las columnas ahora exponen lacellStyles propiedad que permite el estilizado condicional de las celdas de columna. De forma similar acellClasses acepta un literal objeto donde las claves son propiedades de estilo y los valores son expresiones para su evaluación. Además, puedes aplicar peinados normales con facilidad (sin ninguna condición).

    En el ejemplo anterior hemos creado:

    • Dos estilos diferentes que se aplicarán según el índice de la columna.
    • También cambiarás lastext color filas pares o impares.

    La firma de callback para amboscellStyles es:

    (rowData: any, columnKey: string, cellValue: any, rowIndex: number) => boolean
    

    Definamos nuestros estilos:

    // component.ts
    public oddColStyles = {
        background: 'linear-gradient(to right, #b993d6, #8ca6db)',
        color: (rowData, coljey, cellValue, rowIndex) => rowIndex % 2 === 0 ? 'white' : 'gray',
        animation: '0.75s popin'
    };
    
    public evenColStyles = {
        background: 'linear-gradient(to right, #8ca6db, #b993d6)',
        color: (rowData, coljey, cellValue, rowIndex) => rowIndex % 2 === 0 ? 'gray' : 'white',
        animation: '0.75s popin'
    };
    

    On ngOnInit we will add the cellStyles configuration for each column of the predefined columns collection, which is used to create the IgxHierarchicalGrid columns dynamically.

    // component.ts
    public ngOnInit() {
        this.data = SINGERS;
        this.columns = [
            { field: 'Artist' },
            { field: 'HasGrammyAward' },
            { field: 'Debut' },
            { field: 'GrammyNominations' },
            { field: 'GrammyAwards' }
        ];
    
        this.applyCSS();
    }
    
    public applyCSS() {
        this.columns.forEach((column, index) => {
            column.cellStyles = (index % 2 === 0 ? this.evenColStyles : this.oddColStyles);
        });
    }
    
    public updateCSS(css: string) {
        this.oddColStyles = {...this.oddColStyles, ...JSON.parse(css)};
        this.evenColStyles = {...this.evenColStyles, ...JSON.parse(css)};
        this.applyCSS();
    }
    
    <igx-hierarchical-grid #hierarchicalGrid [data]="localdata"    
        [autoGenerate]="false"
        [height]="'580px'">
        <igx-column *ngFor="let c of columns"
            [field]="c.field"
            [header]="c.header"
            [cellStyles]="c.cellStyles">
        </igx-column>
    </igx-hierarchical-grid>
    

    Define unapopin animación

    // component.scss
    @keyframes popin {
        0% {
            opacity: 0.1;
            transform: scale(.75, .75);
            filter: blur(3px) invert(1);
        }
    
        50% {
            opacity: .5;
            filter: blur(1px);
        }
    
        100% {
            transform: scale(1, 1);
            opacity: 1;
            filter: none;
        }
    }
    

    Demo

    Known issues and limitations

    • Si hay celdas vinculadas a la misma condición (de columnas diferentes) y una celda se actualiza, las otras celdas no se actualizarán basándose en el nuevo valor, si se cumple la condición. Debe realizarse una comprobación de tuberías para aplicar los cambios al resto de las celdas. El ejemplo de abajo muestra cómo hacerlo con unspread operator(...) evento encendidoonCellEdit. Esto copiará el objeto original con una nueva instancia y se disparará la tubería de plomo puro.
    public backgroundClasses = {
        myBackground: (rowData: any, columnKey: string) => {
            return rowData.Col2 < 10;
        }
    };
    ...
    
    editDone(evt) {
        this.backgroundClasses = {...this.backgroundClasses};
    }
    
    
    <igx-hierarchical-grid #grid1 [data]="data" height="500px" width="100%" (onCellEdit)="editDone($event)">
      <igx-column field="Col1" dataType="number" [cellClasses]="backgroundClasses"></igx-column>
      <igx-column field="Col2" dataType="number" [editable]="true" [cellClasses]="backgroundClasses"></igx-column>
      <igx-column field="Col3" header="Col3" dataType="string" [cellClasses]="backgroundClasses"></igx-column>
    </igx-hierarchical-grid>
    

    API References

    Additional Resources

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