Descripción general del componente Angular Query Builder
Angular Query Builder es parte de nuestros componentes Angular y proporciona una interfaz de usuario completa que permite a los desarrolladores crear consultas de filtrado de datos complejas para un conjunto de datos específico. Con este componente, pueden crear un árbol de expresiones y establecer condiciones AND/OR entre ellas con editores y listas de condiciones determinadas por el tipo de datos de cada campo. El árbol de expresiones se puede transformar fácilmente en una consulta en el formato que admita el backend.
El componente IgxQueryBuilderComponent
proporciona una forma de crear consultas complejas a través de la interfaz de usuario. Al especificar operadores, condiciones y valores Y/O, el usuario crea un árbol de expresión que describe la consulta.
Ejemplo de generador de consultas Angular
Hemos creado este ejemplo de Angular Query Builder para mostrarle las funcionalidades predeterminadas del componente Angular Query Builder. Haga clic en el botón más para agregar condiciones, el grupo "y" y el grupo "o". La agrupación o desagrupación de expresiones, así como el reordenamiento, se pueden lograr a través de la funcionalidad de arrastrar y soltar.
¿Te gusta esta muestra? Obtenga acceso a nuestro kit de herramientas de Ignite UI for Angular completo y comience a crear sus propias aplicaciones en minutos. Descárgalo gratis.
Introducción a Ignite UI for Angular Generador de consultas
Para empezar a utilizar el componente Ignite UI for Angular Query Builder, primero debe instalar Ignite UI for Angular. En una aplicación Angular existente, escriba el siguiente comando:
ng add igniteui-angular
cmd
Para obtener una introducción completa al Ignite UI for Angular, lea el tema de introducción.
El siguiente paso es importar IgxQueryBuilderModule
en el archivo app.module.ts.
// app.module.ts
import { IgxQueryBuilderModule } from 'igniteui-angular';
// import { IgxQueryBuilderModule } from '@infragistics/igniteui-angular'; for licensed package
@NgModule({
...
imports: [..., IgxQueryBuilderModule],
...
})
export class AppModule {}
typescript
Alternativamente, a partir de 16.0.0
, puede importar IgxQueryBuilderComponent
como una dependencia independiente o usar el token IGX_QUERY_BUILDER_DIRECTIVES
para importar el componente y todos sus componentes y directivas de soporte.
// home.component.ts
import { IGX_QUERY_BUILDER_DIRECTIVES, FilteringExpressionsTree, FieldType } from 'igniteui-angular';
// import { IGX_QUERY_BUILDER_DIRECTIVES, FilteringExpressionsTree, FieldType } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-home',
template: `
<igx-query-builder #queryBuilder
[entities]="entities"
[(expressionTree)]="expressionTree"
(expressionTreeChange)="onExpressionTreeChange()">
</igx-query-builder>
`,
styleUrls: ['home.component.scss'],
standalone: true,
imports: [IGX_QUERY_BUILDER_DIRECTIVES]
/* or imports: [IgxQueryBuilderComponent] */
})
export class HomeComponent {
public expressionTree: FilteringExpressionsTree;
public entities: Array<any>;
public onExpressionTreeChange() {
...
}
}
typescript
Ahora que ha importado el módulo o las directivas de Ignite UI for Angular Query Builder, puede empezar a utilizar el igx-query-builder
componente.
Uso del generador de consultas Angular
Si no se establece inicialmente ningún árbol de expresión, comience eligiendo una entidad y cuáles de sus campos debe devolver la consulta. Después de eso, se pueden agregar condiciones o subgrupos.
Para añadir una condición, seleccione un campo, un operando basado en el tipo de datos del campo y un valor si el operando no es unario. Los operandos In
y Not In
le permitirán crear una consulta interna con condiciones para una entidad diferente en lugar de simplemente proporcionar un valor. Una vez confirmada la condición, aparece un chip con la información de la condición. Al hacer clic o pasar el cursor sobre el chip, tiene las opciones para modificarlo o agregar otra condición o grupo justo después de él.
Al hacer clic en el botón (AND
o OR
) situado encima de cada grupo, se abrirá un menú con opciones para cambiar el tipo de grupo o desagrupar las condiciones que contienen.
Dado que cada condición está relacionada con un campo específico de una entidad en particular, cambiar la entidad conducirá al restablecimiento de todas las condiciones y grupos preestablecidos. Al seleccionar una nueva entidad, se mostrará un cuadro de diálogo de confirmación, a menos que la propiedad de showEntityChangeDialog
entrada se establezca en false.
Puede empezar a utilizar el componente estableciendo la entities
propiedad en una matriz que describa el nombre de la entidad y una matriz de sus campos, donde cada campo se define por su nombre y tipo de datos. Una vez que se selecciona un campo, se asignarán automáticamente los operandos correspondientes en función del tipo de datos. El Generador de consultas tiene la expressionTree
propiedad input. Puede usarlo para establecer un estado inicial del control y tener acceso a la lógica de filtrado especificada por el usuario.
ngAfterViewInit(): void {
const innerTree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'Companies', ['ID']);
innerTree.filteringOperands.push({
fieldName: 'Employees',
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
conditionName: 'greaterThan',
searchVal: 100
});
innerTree.filteringOperands.push({
fieldName: 'Contact',
condition: IgxBooleanFilteringOperand.instance().condition('true'),
conditionName: 'true'
});
const tree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'Orders', ['*']);
tree.filteringOperands.push({
fieldName: 'CompanyID',
condition: IgxStringFilteringOperand.instance().condition('inQuery'),
conditionName: 'inQuery',
searchTree: innerTree
});
tree.filteringOperands.push({
fieldName: 'OrderDate',
condition: IgxDateFilteringOperand.instance().condition('before'),
conditionName: 'before',
searchVal: new Date('2024-01-01T00:00:00.000Z')
});
tree.filteringOperands.push({
fieldName: 'ShippedDate',
condition: IgxDateFilteringOperand.instance().condition('null'),
conditionName: 'null'
});
this.queryBuilder.expressionTree = tree;
}
typescript
Es expressionTree
una propiedad enlazable bidireccional, lo que significa que se implementa una salida correspondiente expressionTreeChange
que se emite cuando el usuario final cambia la interfaz de usuario creando, editando o quitando condiciones. También se puede suscribir por separado para recibir notificaciones y reaccionar a dichos cambios.
<igx-query-builder #queryBuilder
[entities]="entities"
[(expressionTree)]="expressionTree"
(expressionTreeChange)="onExpressionTreeChange()">
</igx-query-builder>
html
Arrastre de expresiones
Los chips de condición se pueden reposicionar fácilmente utilizando los enfoques de reordenamiento de arrastrar y soltar del mouse o del teclado. Con ellos, los usuarios pueden ajustar su lógica de consulta de forma dinámica.
- Arrastrar una ficha no modifica su condición/contenido, solo su posición.
- El chip también se puede arrastrar a lo largo de grupos y subgrupos. Por ejemplo, la agrupación/desagrupación de expresiones se logra a través de la funcionalidad de arrastre de expresiones. Para agrupar las condiciones ya existentes, primero debe agregar un nuevo grupo a través del botón 'agregar' grupo. Luego, mediante el arrastre, las expresiones requeridas se pueden mover a ese grupo. Para desagrupar, puede arrastrar todas las condiciones fuera de su grupo actual y una vez que se elimine la última condición, el grupo se eliminará.
Las fichas de un árbol de consulta no se pueden arrastrar en otro, por ejemplo, del padre al interno y viceversa.

Interacción con el teclado
Combinaciones de teclas
- Tab / Shift + Tab- navega al chip siguiente/anterior, indicador de arrastre, botón de eliminación, botón de expresión 'agregar'.
- Arrow Down / Arrow Up- Cuando el indicador de arrastre del chip está enfocado, el chip se puede mover hacia arriba / abajo.
- Space / Enter- La expresión enfocada entra en el modo de edición. Si se ha movido la ficha, esto confirma su nueva posición.
- Esc- El reordenamiento de Chip se cancela y vuelve a su posición original.
El reordenamiento del teclado proporciona la misma funcionalidad que la función de arrastrar y soltar del ratón. Una vez que se mueve una ficha, el usuario debe confirmar la nueva posición o cancelar el reorden.

Plantillas
El componente Generador de consultas de Ignite UI for Angular permite definir plantillas para el encabezado del componente y el valor de búsqueda utilizando los siguientes nombres de referencia predefinidos:
Plantilla de encabezado
De forma predeterminada, no se mostraría el IgxQueryBuilderComponent
encabezado. Con el fin de definir tal, el IgxQueryBuilderHeaderComponent
debe agregarse dentro de el igx-query-builder
.
Luego, para establecer el título del encabezado se podría usar la entrada y pasar el title
contenido dentro del permite crear plantillas en el encabezado del generador de igx-query-builder-header
consultas.
El siguiente fragmento de código ilustra cómo hacerlo:
<igx-query-builder #queryBuilder [entities]="this.entities">
<igx-query-builder-header [title]="'Query Builder Template Sample'">
</igx-query-builder-header>
</igx-query-builder>
html
Valor de búsqueda
El valor de búsqueda de una condición se puede modelar usando la igxQueryBuilderSearchValue
directiva, aplicada a un <ng-template>
interior del cuerpo de la igx-query-builder
:
<igx-query-builder #queryBuilder
[entities]="entities"
[expressionTree]="expressionTree">
<ng-template #searchValueTemplate
igxQueryBuilderSearchValue
let-searchValue
let-selectedField = "selectedField"
let-selectedCondition = "selectedCondition"
let-defaultSearchValueTemplate = "defaultSearchValueTemplate">
@if (
selectedField?.field === 'Region' &&
(selectedCondition === 'equals' || selectedCondition === 'doesNotEqual')
){
<igx-select [placeholder]="'Select region'" [(ngModel)]="searchValue.value">
<igx-select-item *ngFor="let reg of regionOptions" [value]="reg">
{{ reg.text }}
</igx-select-item>
</igx-select>
}
@else if (
selectedField?.field === 'OrderStatus' &&
(selectedCondition === 'equals' || selectedCondition === 'doesNotEqual')
){
<igx-radio-group>
<igx-radio class="radio-sample"
*ngFor="let stat of statusOptions"
value="{{stat.value}}"
[(ngModel)]="searchValue.value">
{{stat.text}}
</igx-radio>
</igx-radio-group>
}
@else {
<ng-container #defaultTemplate *ngTemplateOutlet="defaultSearchValueTemplate"></ng-container>
}
</ng-template>
</igx-query-builder>
html
Formateador
Para cambiar la apariencia del valor de búsqueda en el chip que se muestra cuando una condición no está en modo de edición, puede establecer una función de formateador en la matriz de campos. El valor de búsqueda y la condición seleccionada se pueden acceder a través de los argumentos value y rowData de la siguiente manera:
this.ordersFields = [
{ field: "CompanyID", dataType: "string" },
{ field: "OrderID", dataType: "number" },
{ field: "EmployeeId", dataType: "number" },
{ field: "OrderDate", dataType: "date" },
{ field: "RequiredDate", dataType: "date" },
{ field: "ShippedDate", dataType: "date" },
{ field: "ShipVia", dataType: "number" },
{ field: "Freight", dataType: "number" },
{ field: "ShipName", dataType: "string" },
{ field: "ShipCity", dataType: "string" },
{ field: "ShipPostalCode", dataType: "string" },
{ field: "ShipCountry", dataType: "string" },
{ field: "Region", dataType: "string", formatter: (value: any, rowData: any) => rowData === 'equals' || rowData === 'doesNotEqual' ? `${value.value}` : value }},
{ field: "OrderStatus", dataType: "number" }
];
ts
Manifestación
Hemos creado este ejemplo de Angular Query Builder para mostrarle las funcionalidades de plantillas y formateador para el encabezado y el valor de búsqueda del componente Angular Query Builder.
Estilo
Para comenzar a diseñar el Generador de consultas, necesitamos importar el archivo index
, donde se encuentran todas las funciones del tema y los mixins de componentes:
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
scss
El Generador de consultas toma el color de fondo de su tema, utilizando el parámetro background
. Para cambiar el fondo necesitamos crear un tema personalizado:
$custom-query-builder: query-builder-theme(
$background: #292826,
...
);
scss
Dado que tenemos otros componentes dentro del Generador de consultas, como botones, chips, menús desplegables y entradas, necesitamos crear un tema separado para cada uno:
$custom-button: button-theme(
$schema: $dark-material-schema,
$background: #292826,
$foreground: #ffcd0f,
...
);
$custom-input-group: input-group-theme(
$focused-secondary-color: #ffcd0f
);
$custom-chip: chip-theme(
$background: #ffcd0f,
$text-color: #292826
);
$custom-icon-button: icon-button-theme(
$background: #ffcd0f,
$foreground: #292826
);
scss
En este ejemplo, solo cambiamos algunos de los parámetros para los componentes enumerados, pero los button-theme
chip-theme
drop-down-theme
input-group-theme
temas proporcionan muchos más parámetros para controlar sus respectivos estilos.
En lugar de codificar los valores de color como acabamos de hacer, podemos lograr una mayor flexibilidad en términos de colores mediante el uso de las palette
funciones y color
. Consulte el Palettes
tema para obtener orientación detallada sobre cómo usarlos.
El último paso es incluir los nuevos temas componentes utilizando la css-vars
mezcla.
@include css-vars($custom-query-builder);
:host {
::ng-deep {
@include css-vars($custom-input-group);
@include css-vars($custom-chip);
@include css-vars($custom-icon-button);
.igx-filter-tree__buttons {
@include css-vars($custom-button);
}
}
}
scss
Si el componente está usando un Emulated
ViewEncapsulation, es necesario penetrate
que esta encapsulación use::ng-deep
para diseñar los componentes dentro del componente del generador de consultas (botón, chip, menú desplegable ... etcétera).
Manifestación
La muestra no se verá afectada por el tema global seleccionado en Change Theme
.
También puede optimizar el desarrollo de su aplicación Angular utilizando WYSIWYG App Builder ™ con componentes de interfaz de usuario reales.
Referencias de API
- API de componentes IgxQueryBuilder
- IgxQueryBuilderHeaderComponent
- IgxQueryBuilderSearchValueTemplateDirectiva
- Estilos de componentes IgxQueryBuilder