Estilo condicional de cuadrícula de árbol Angular
Si necesita proporcionar algún estilo personalizado en el componente IgxTreeGrid, puede hacerlo a nivel de fila o de celda.
Tree Grid Conditional Row Styling
El componente IgxTreeGrid en Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a filas según reglas personalizadas.
- By setting
rowClasses
input on the IgxTreeGrid component; - Al configurar la entrada
rowStyles
en el componente IgxTreeGrid;
Más adelante en este tema los cubriremos con más detalle.
Using rowClasses
Puede diseñar condicionalmente las filas de IgxTreeGrid configurando la entrada rowClasses
y definiendo reglas personalizadas.
<!-- sample.component.html -->
<igx-tree-grid #treeGrid [data]="data" [height]="'600px'" [width]="'100%'" [rowClasses]="rowClasses">
...
</igx-tree-grid>
La entrada rowClasses
acepta un objeto literal, que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada 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;
}
}
Utilice::ng-deep o ViewEncapsulation.None
para forzar los estilos personalizados a través del componente actual y sus hijos.
Demo
Using rowStyles
Las columnas ahora exponen la propiedad rowStyles
que permite aplicar estilos condicionales a las filas de datos. Similar a rowClasses
acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para evaluación. Además, puedes aplicar un peinado regular (sin condiciones).
La firma de devolución de llamada tanto para
rowStyles
como pararowClasses
es:
(row: RowType) => boolean
Definamos nuestros estilos:
// component.ts
public background = (row: RowType) => row.data['Title'] === 'CEO' ? '#6c757d' :
row.data['Title'].includes('President') ? '#adb5bd' :
row.data['Title'].includes('Director') ? '#ced4da' :
row.data['Title'].includes('Manager') ? '#dee2e6' :
row.data['Title'].includes('Lead') ? '#e9ecef' :
row.data['Title'].includes('Senior') ? '#f8f9fa' : null;
public rowStyles = {
background: this.background,
'border-left': (row: RowType) => row.data['Title'] === 'CEO' || row.data['Title'].includes('President') ?
'2px solid' : null,
'border-color': (row: RowType) => row.data['Title'] === 'CEO' ? '#495057' : null,
color: (row: RowType) => row.data['Title'] === 'CEO' ? '#fff' : null
};
<!-- sample.component.html -->
<igx-tree-grid #treeGrid [data]="data" [moving]="true" primaryKey="ID" foreignKey="ParentID"
width="100%" height="550px" [rowStyles]="rowStyles">
...
</igx-tree-grid>
Demo
Tree Grid Conditional Cell Styling
Descripción general
El componente IgxTreeGrid en Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a las celdas según reglas personalizadas.
- Configurando las
cellClasses
de entradaIgxColumnComponent
en un objeto literal que contiene pares clave-valor. La clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada que devuelve un valor booleano o booleano. El resultado es una cómoda colocación del material en la celda.
// 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
Puede diseñar condicionalmente las celdas IgxTreeGrid configurando la entrada IgxColumnComponent
cellClasses
y definiendo reglas personalizadas.
<!-- sample.component.html -->
<igx-column field="UnitPrice" header="Unit Price" [dataType]="'currency'" [pipeArgs]="formatOptions" [cellClasses]="priceClasses"></igx-column>
La entrada cellClasses
acepta un objeto literal, que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada que devuelve un valor booleano o booleano.
// sample.component.ts
private upPriceCondition = (rowData: any, columnKey: any): boolean => {
return rowData[columnKey] > 5;
}
private downPriceCondition = (rowData: any, columnKey: any): boolean => {
return rowData[columnKey] <= 5;
}
public priceClasses = {
downPrice: this.downPriceCondition,
upPrice: this.upPriceCondition
};
// sample.component.scss
::ng-deep {
.upPrice {
color: red;
}
.downPrice {
color: green;
}
}
Utilice::ng-deep o ViewEncapsulation.None
para forzar los estilos personalizados a través del componente actual y sus hijos.
Demo
- Utilizando la entrada
cellStyles
IgxColumnComponent
, que acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para 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 devolución de llamada para
cellStyles
ycellClasses
ahora se cambia a:
(rowData: any, columnKey: string, cellValue: any, rowIndex: number) => boolean
Using cellStyles
Las columnas ahora exponen la propiedad cellStyles
que permite aplicar estilos condicionales a las celdas de las columnas. Al igual que cellClasses
acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para evaluación. Además, puedes aplicar el peinado habitual con facilidad (sin condiciones).
En el ejemplo anterior hemos creado:
- Dos estilos diferentes que se aplicarán según el índice de la columna.
- También cambiará el
text color
según las filas pares/impares.
La firma de devolución de llamada para ambos
cellStyles
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'
};
En ngOnInit
agregaremos la configuración cellStyles
para cada columna de la colección columns
predefinidas, que se utiliza para crear las columnas IgxTreeGrid dinámicamente.
// component.ts
public ngOnInit() {
this.data = ORDERS_DATA;
this.columns = [
{ field: 'ID' },
{ field: 'Name' },
{ field: 'UnitPrice' },
{ field: 'OrderDate' }
];
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();
}
//component.html
<igx-tree-grid
#grid1 [data]="data"
primaryKey="ID" foreignKey="ParentID"
height="350px">
<igx-column *ngFor="let c of columns"
[field]="c.field"
[header]="c.header"
[cellStyles]="c.cellStyles">
</igx-column>
</igx-tree-grid>
Definir una animación popin
// 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 diferentes columnas) y una celda se actualiza, las otras celdas no se actualizarán según el nuevo valor, si se cumple la condición. Se debe realizar una verificación de la tubería para aplicar los cambios al resto de las celdas. El siguiente ejemplo muestra cómo hacerlo con un
spread operator
... en el eventoonCellEdit
. Esto copiará el objeto original con una nueva instancia y hará que se active la tubería pura.
public backgroundClasses = {
myBackground: (rowData: any, columnKey: string) => {
return rowData.Col2 < 10;
}
};
...
editDone(evt) {
this.backgroundClasses = {...this.backgroundClasses};
}
<igx-tree-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-tree-grid>
API References
Additional Resources
- Descripción general de la cuadrícula de árbol
- Virtualización y rendimiento
- Edición
- Paginación
- Filtración
- Clasificación
- resúmenes
- Columna en movimiento
- Fijación de columnas
- Cambio de tamaño de columna
- Ocultación de columnas
- Selección
- buscando
- Barra de herramientas
- Encabezados de varias columnas
- Tamaño