Descripción general del componente de vista de lista Angular

    El componente Ignite UI for Angular List muestra filas de elementos y admite uno o más elementos de encabezado, así como la búsqueda y el filtrado de elementos de la lista. Cada elemento de la lista es completamente adaptable y admite cualquier componente HTML o Angular válido. El componente de lista también proporciona funciones de panorámica integradas, plantillas para estados vacíos y de carga, y admite virtualización para listas grandes mediante la directiva IgxForOf.

    Angular List Example

    El siguiente ejemplo representa una lista llena de contactos con propiedades de nombre y número de teléfono. El componente IgxList utiliza igx-avatar e igx-icon para enriquecer la experiencia del usuario y exponer las capacidades de configurar una imagen de avatar y un ícono diferente para marcar un contacto como favorito. Además, la Vista de lista expone las capacidades de clasificación logradas mediante el uso de nuestro canal de filtrado.

    Getting Started with Ignite UI for Angular List

    Para comenzar con el componente Ignite UI for Angular List View, 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 IgxListModule en el archivo app.module.ts.

    Note

    Este componente requiere que HammerModule se importe en el módulo raíz de la aplicación para que las interacciones táctiles funcionen como se espera..

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

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

    // home.component.ts
    
    import { HammerModule } from '@angular/platform-browser';
    import { IGX_LIST_DIRECTIVES } from 'igniteui-angular';
    // import { IGX_LIST_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        selector: 'app-home',
        template: `
        <igx-list>
            <igx-list-item isHeader="true">Header</igx-list-item>
            <igx-list-item>Item 1</igx-list-item>
            <igx-list-item>Item 2</igx-list-item>
            <igx-list-item>Item 3</igx-list-item>
        </igx-list>
        `,
        styleUrls: ['home.component.scss'],
        standalone: true,
        imports: [IGX_LIST_DIRECTIVES, HammerModule]
        /* or imports: [IgxListComponent, IgxListItemComponent, HammerModule] */
    })
    export class HomeComponent {}
    

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

    Using the Angular List

    Luego, en la plantilla de nuestro componente de contactos podemos crear nuestra lista, pero ¿qué pasa si actualmente (o en algún momento en el futuro) no tenemos elementos en ella? En este caso, la lista Angular nos proporciona una plantilla predeterminada que se utiliza cuando la lista está vacía. Siempre podemos proporcionar nuestra propia plantilla para el aspecto de nuestra lista vacía simplemente usando la directiva igxEmptyList. En este caso, no se utilizará la plantilla predeterminada:

    <!--contacts.component.html-->
    
    <igx-list>
        <ng-template igxEmptyList>
            <p class="empty">No contacts! :(</p>
        </ng-template>
    </igx-list>
    

    Y nuestro estilo para la plantilla vacía:

    /* contacts.component.css */
    
    .empty {
        color: rgba(0, 153, 255, 1);
        font-size: 25px;
        font-weight: 600;
        text-shadow: 2px 1px 2px rgba(150, 150, 150, 1);
    }
    

    Si todo salió bien, así es como debería verse nuestra lista vacía:

    A veces puede haber un retraso en la carga de datos. En este caso, puede establecer la propiedad isLoading de la lista en true y una plantilla predeterminada informará al usuario sobre el proceso de carga de datos en curso. También puedes proporcionar tu propia plantilla de carga usando la directiva igxDataLoading:

    <!--contacts.component.html-->
    
    <igx-list>
        <ng-template igxDataLoading>
            <p class="loading">Patience, we are currently loading your data...</p>
        </ng-template>
    </igx-list>
    
    /* contacts.component.css */
    
    .loading {
        color: rgba(255, 153, 0, 1);
        font-size: 25px;
        font-weight: 600;
        text-shadow: 2px 1px 2px rgba(150, 150, 150, 1);
    }
    

    Add List Items

    Es bueno tener una plantilla para cuando la lista esté vacía, ¡pero ahora agreguemos algunos elementos! Podemos agregar el siguiente código para obtener una lista simple de elementos:

    <!--contacts.component.html-->
    
    <igx-list>
        <igx-list-item isHeader="true">Header</igx-list-item>
        <igx-list-item>Item 1</igx-list-item>
        <igx-list-item>Item 2</igx-list-item>
        <igx-list-item>Item 3</igx-list-item>
    </igx-list>
    

    Si todo ha ido bien deberías ver lo siguiente en tu navegador:

    Mejoremos un poco nuestro juego y mejoremos los elementos de nuestra lista. Digamos que queremos crear una lista Angular de contactos con un nombre y un número de teléfono debajo del nombre. En nuestro archivo mecanografiado de componentes podemos definir una lista de contactos:

    // contacts.component.ts
    ...
    public contacts = [{
        name: "Terrance Orta",
        phone: "770-504-2217"
    }, {
        name: "Richard Mahoney",
        phone: "423-676-2869"
    }, {
        name: "Donna Price",
        phone: "859-496-2817"
    }, {
        name: "Lisa Landers",
        phone: "901-747-3428"
    }, {
        name: "Dorothy H. Spencer",
        phone: "573-394-9254"
    }];
    

    Ahora que tenemos algunos datos que queremos representar, configuremos algunas marcas. Si queremos algo de estilo listo para usar, podemos usar algunas de las directivas que vienen con los elementos de la lista.

    Veamos cómo podemos usar algunos de ellos en el siguiente ejemplo:

    <!--contacts.component.html-->
    
    <igx-list>
      <igx-list-item isHeader="true">
        Contacts
      </igx-list-item>
      <igx-list-item *ngFor="let contact of contacts">
        <h4 igxListLineTitle>{{ contact.name }}</h4>
        <p igxListLineSubTitle>{{ contact.phone }}</p>
      </igx-list-item>
    </igx-list>
    

    Ambas directivas igxListLineTitle e igxListLineSubTitle le dan a los elementos de nuestra lista una apariencia predeterminada.

    Después de todo eso, nuestra lista Angular ahora debería verse así:

    Adding Avatar and Icons

    Podemos usar algunos de nuestros otros componentes junto con el componente IgxList para enriquecer la experiencia y agregar algunas funciones. Podemos tener una bonita imagen de avatar a la izquierda del nombre y los valores del teléfono. Además, podemos agregar un ícono de estrella a la derecha de ellos para permitir al usuario marcar un contacto como favorito. Para hacer eso, tomemos los módulos IgxAvatar e IgxIcon e importemoslos en nuestro archivo app.module.ts.

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

    A continuación, debemos agregar más información a nuestro objeto de contacto, como una fuente photo para nuestro avatar y una propiedad isFavorite para indicar el estado favorito del contacto.

    // contacts.component.ts
    
    public contacts = [{
        name: 'Terrance Orta',
        phone: '770-504-2217',
        photo: 'https://randomuser.me/api/portraits/men/27.jpg',
        isFavorite: false
    }, {
        name: 'Richard Mahoney',
        phone: '423-676-2869',
        photo: 'https://randomuser.me/api/portraits/men/1.jpg',
        isFavorite: true
    }, {
        name: 'Donna Price',
        phone: '859-496-2817',
        photo: 'https://randomuser.me/api/portraits/women/50.jpg',
        isFavorite: false
    }, {
        name: 'Lisa Landers',
        phone: '901-747-3428',
        photo: 'https://randomuser.me/api/portraits/women/3.jpg',
        isFavorite: false
    }, {
        name: 'Dorothy H. Spencer',
        phone: '573-394-9254',
        photo: 'https://randomuser.me/api/portraits/women/67.jpg',
        isFavorite: true
    }];
    

    Genial, ahora actualicemos la plantilla de nuestra lista de contactos para mostrar el avatar y el ícono. Nuevamente podemos hacerlo usando algunas de las directivas de lista.

    <!--contacts.component.html-->
    
    <igx-list>
      <igx-list-item isHeader="true">
        Contacts
      </igx-list-item>
      <igx-list-item #item *ngFor="let contact of contacts;">
          <igx-avatar igxListThumbnail [src]="contact.photo" shape="circle"></igx-avatar>
          <h4 igxListLineTitle>{{ contact.name }}</h4>
          <p igxListLineSubTitle class="phone">{{ contact.phone }}</p>
          <span igxListLine>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dicta, laborum.</span>
          <igx-icon igxListAction [color]="contact.isFavorite ? 'orange' : 'lightgray'" (click)="toggleFavorite(item)">star</igx-icon>
      </igx-list-item>
    </igx-list>
    
    • igxListThumbnail está diseñado para usarse si necesitamos agregar algún tipo de medio al principio de los elementos de nuestra lista. La directiva envolverá el elemento de destino en nuestro caso, igx-avatar, en un contenedor que proporcionará una posición y un espaciado predeterminados.
    • igxListAction está destinado a usarse para elementos de lista que tienen algún tipo de acción o metadatos, por ejemplo, interruptor, botón de opción, casilla de verificación, etc. En nuestro caso, la acción estará representada por un igx-icon. Nuevamente, la directiva envolverá el elemento de destino en un contenedor que tendrá la posición y el espaciado correctos.
    • igxListLine está diseñado para usarse si necesitamos algo de texto entre igxListThumbnail e igxListAction, la directiva se asegurará de que la posición, el espaciado y la alineación del texto se verán geniales con las otras dos directivas.

    A continuación, escuchamos un evento de clic en el componente IgxIcon para alternar la propiedad isFavorite en nuestro objeto de contacto.

    // contacts.component.ts
    
    ...
    toggleFavorite(item: IgxListItem) {
        const contact = this.contacts[item.index - 1];
        contact.isFavorite = !contact.isFavorite;
    }
    

    También permitamos que el usuario elija el tamaño de la lista utilizando la propiedad personalizada CSS--ig-size. Haremos esto importando IgxButtonGroupModule y usando IgxButtonGroup para mostrar todos los valores de tamaño. De esta manera, cada vez que se seleccione uno, actualizaremos el tamaño de la lista.

    // app.module.ts
    ...
    import { IgxButtonGroupModule } from 'igniteui-angular';
    // import { IgxButtonGroupModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        imports: [..., IgxButtonGroupModule]
    })
    
    <!--contacts.component.html-->
    
    <igx-buttongroup [values]="sizes" (selected)="selectSize($event)"></igx-buttongroup>
    ...
    <igx-list>
        ...
    </igx-list>
    
    // contacts.component.ts
    
    public size = 'large';
    public sizes;
    
    public ngOnInit() {
        this.sizes = [
            { label: 'large', selected: this.size === 'large', togglable: true },
            { label: 'medium', selected: this.size === 'medium', togglable: true },
            { label: 'small', selected: this.size === 'small', togglable: true }
        ];
    }
    
    public selectSize(event: any) {
        this.size = this.sizes[event.index].label;
    }
    
    
    @HostBinding('style.--ig-size')
    protected get sizeStyle() {
        return `var(--ig-size-${this.size})`;
    }
    

    Y aquí está el resultado de todo ese trabajo:

    List Items Panning

    Ahora que tenemos una lista Angular tan hermosa con contactos y sus números de teléfono, ¿por qué no implementamos la capacidad de llamar a un contacto? IgxList tiene la solución perfecta para esto: panorámica de elementos de la lista. Para ello hay que implementar los siguientes pasos:

    • Habilite la panorámica usando las propiedades allowLeftPanning y/o allowRightPanning
    • Definir plantillas para la panorámica izquierda y/o derecha
    • Manejar los eventos de panorámica del elemento de la lista y realizar la acción deseada

    El siguiente ejemplo demuestra cómo manejar la panorámica izquierda y derecha. El controlador de eventos para la panorámica derecha muestra un mensaje de brindis. El controlador de eventos para la panorámica izquierda elimina un elemento de IgxList.

    Note

    Tenga en cuenta que la eliminación de elementos de la lista es una tarea de la aplicación. La propia IgxList no puede eliminar elementos de la fuente de datos porque IgxList no tiene referencia a la fuente de datos.

    Aquí está el código HTML del ejemplo:

    <!-- contacts.component.html -->
    
    <igx-list [allowLeftPanning]="true" [allowRightPanning]="true"
      (leftPan)="leftPanPerformed($event)" (rightPan)="rightPanPerformed($event)">
      <ng-template igxListItemLeftPanning>
        <div class="listItemLeftPanningStyle">
          <igx-icon [color]="white" style="margin-left:10px">delete</igx-icon>Delete
        </div>
      </ng-template>
      <ng-template igxListItemRightPanning>
        <div class="listItemRightPanningStyle">
          <igx-icon [color]="white" style="margin-right:10px">call</igx-icon>Dial
        </div>
      </ng-template>
      <igx-list-item isHeader="true">Contacts</igx-list-item>
      <igx-list-item #item *ngFor="let contact of contacts">
        <igx-avatar igxListThumbnail [src]="contact.photo" shape="circle"></igx-avatar>
        <h4 igxListLineTitle>{{ contact.name }}</h4>
        <p igxListLineSubTitle class="phone">{{ contact.phone }}</p>
        <igx-icon igxListAction [color]="contact.isFavorite ? 'orange' : 'lightgray'" (click)="toggleFavorite(item)">star</igx-icon>
      </igx-list-item>
    </igx-list>
    
    <igx-toast #toast></igx-toast>
    

    El ejemplo anterior utiliza algunos estilos CSS que se pueden encontrar aquí:

    /* contacts.component.css */
    
    igx-icon {
        cursor: pointer;
        user-select: none;
    }
    
    .listItemLeftPanningStyle {
        display: flex;
        flex-direction: row-reverse;
        background-color:orange;
        color: white;
        width: 100%;
        padding-right: 10px;
        align-items: center;
    }
    
    .listItemRightPanningStyle {
        display: flex;
        flex-direction: row;
        background-color:limegreen;
        color: white;
        width: 100%;
        padding-left: 10px;
        align-items: center;
    }
    

    Y finalmente aquí está el código mecanografiado que maneja los eventos de panorámica:

    // contacts.component.ts
    
    ...
    @ViewChild('toast')
    public toast: IgxToastComponent;
    
    public rightPanPerformed(args) {
      args.keepItem = true;
      this.toast.message = 'Dialing ' + this.contacts[args.item.index - 1].name;
      this.toast.open();
    }
    
    public leftPanPerformed(args) {
      args.keepItem = false;
      setTimeout((idx = args.item.index - 1) => {
        this.toast.message = 'Contact ' + this.contacts[idx].name + ' removed.';
        this.toast.open();
        this.contacts.splice(idx, 1);
      }, 500);
    }
    
    ...
    
    Note

    Al realizar una panorámica de los elementos de la lista, hay un umbral que se debe alcanzar para que se emitan los eventos de panorámica. Puede cambiar el umbral utilizando la propiedad panEndTriggeringThreshold de IgxList. De forma predeterminada, esta propiedad tiene un valor de 0,5, lo que significa el 50% del ancho del elemento de la lista.

    Ahora intente desplazarse por los elementos de la lista usted mismo:

    Angular filter list

    Nuestra lista se ve bien, pero ¿no sería aún mejor si pudiéramos buscar contactos por nombre? Esto lo podemos lograr fácilmente utilizando nuestro tubo filtrante. Hagámoslo.

    Primero agreguemos un campo de entrada en la parte superior de nuestra plantilla de componente Angular y vincúlelo a una propiedad en nuestro componente llamada searchContact:

    <!--contacts.component.html-->
    
    <igx-input-group type="search" class="search">
        <igx-prefix>
            <igx-icon>search</igx-icon>
        </igx-prefix>
        <input #search igxInput placeholder="Search Contacts" [(ngModel)]="searchContact">
        <igx-suffix *ngIf="search.value.length > 0" (click)="searchContact = null">
            <igx-icon>clear</igx-icon>
        </igx-suffix>
    </igx-input-group>
    

    Es hora de importar IgxFilterModule e IgxInputGroupModule en nuestro archivo app.module.ts e IgxFilterOptions en nuestro componente de contactos:

    // app.module.ts
    ...
    import { IgxFilterModule, IgxInputGroupModule } from 'igniteui-angular';
    // import { IgxFilterModule, IgxInputGroupModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        imports: [..., IgxFilterModule, IgxInputGroupModule]
    })
    
    // contacts.component.ts
    ...
    import { IgxFilterOptions } from 'igniteui-angular';
    // import { IgxFilterOptions } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({...})
    export class ContactListComponent {
        public searchContact: string;
        ...
        get filterContacts(): IgxFilterOptions {
            const fo = new IgxFilterOptions();
            fo.key = 'name';
            fo.inputValue = this.searchContact;
            return fo;
        }
    }
    

    Después de importar IgxFilterOptions, debemos registrar un nuevo método getter que devolverá las opciones de filtrado que utilizará la canalización cada vez que se actualice la propiedad searchContact. Para que el filtro funcione necesitamos registrar una key para filtrar el objeto de contacto. En nuestro caso ese sería el name de cada contacto. La segunda propiedad que debe registrarse en el objeto IgxFilterOptions es el valor que debemos comparar al comparar nuestro nombre de contacto. Esta sería la propiedad searchContact que vinculamos al campo de entrada encima de nuestra lista de contactos.

    Finalmente, debemos aplicar el tubo de filtrado a los datos de nuestros contactos antes de poder usarlo. Entonces en nuestra plantilla simplemente agregamos:

    <!--contacts.component.html-->
    
    <igx-list-item *ngFor="let contact of contacts | igxFilter: filterContacts; let i = index">
        ...
    </igx-list-item>
    

    List Item Selection

    Como probablemente ya habrás notado, los elementos de la lista no proporcionan estados de selección. Sin embargo, si su aplicación requiere que su lista realice un seguimiento de qué elemento se selecciona, le brindamos un ejemplo de cómo se puede lograr esto. Todo lo que necesita hacer es realizar un seguimiento del estado en algún lugar de su componente o en los datos a los que está vinculada la lista.

    Aquí hay un ejemplo, en el que aplicamos un color de fondo a la lista de acuerdo con el color secundario 500 del tema, según el seguimiento del estado proveniente de los datos a los que está vinculada la lista:

    Lo que estamos haciendo es agregar una propiedad selected adicional a cada miembro de datos, cuyo valor predeterminado es false. Al hacer clic en el elemento de la lista, restablecemos todas las propiedades selected en la recopilación de datos y configuramos la correspondiente al elemento en el que se hizo clic en true. Según la propiedad seleccionada, aplicamos una clase CSS al elemento de la lista que le proporciona el fondo seleccionado.

    <igx-list>
        <igx-list-item isHeader="true">Contacts</igx-list-item>
        <igx-list-item [ngClass]="contact.selected ? 'selected' : ''"
                        (click)="selectItem(contact)"
                        *ngFor="let contact of contacts | igxFilter: filterContacts;">
            <igx-avatar igxListThumbnail [src]="contact.photo" shape="circle"></igx-avatar>
            <span igxListLineTitle>{{ contact.name }}</span>
            <span igxListLineSubTitle>{{ contact.phone }}</span>
            <igx-icon igxListAction [style.color]="contact.isFavorite ? 'orange' : 'lightgray'" (click)="toggleFavorite(contact, $event)">star</igx-icon>
        </igx-list-item>
    </igx-list>
    
    public selectItem(item) {
        if (!item.selected) {
            this.contacts.forEach(c => c.selected = false);
            item.selected = true;
        }
    }
    
    .selected {
        background-color: hsla(var(--igx-secondary-500))
    }
    

    Applying theme to the list component

    Veamos cómo podemos cambiar el fondo de nuestra lista. Primero necesitamos importar index.scss al archivo .scss de nuestro componente.

    @use "igniteui-angular/theming" as *;
    
    // IMPORTANT: Prior to Ignite UI for Angular version 13 use:
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    

    Luego necesitamos crear un tema para nuestro componente.

    :host ::ng-deep {
        $my-list-theme: list-theme(
            $background: #0568ab
        );
    
        @include list($my-list-theme);
    }
    

    El resultado del código anterior es

    Note

    Tenga en cuenta que si creamos el tema de nuestro componente en el archivo .scss del componente, necesitamos usar::ng-deep para pasar la encapsulación de la vista, de lo contrario, nuestro nuevo tema no funcionará. Para obtener más información, consulte: Temas de componentes.

    Para obtener una lista completa de los parámetros que puede cambiar para el componente de lista, consulte: Estilos de componentes IgxList

    API References

    En este artículo cubrimos mucho terreno con el componente de lista Angular. Creamos una lista de elementos de contacto. Se utilizó alguna Ignite UI for Angular dentro de los elementos de nuestra lista, como avatares e íconos. Creé un diseño de elemento personalizado y le di estilo. Finalmente, agregamos filtrado de listas. El componente de lista tiene algunas API más para explorar, que se enumeran a continuación.

    Componentes Angular adicionales que se utilizaron:

    Theming Dependencies

    Additional Resources

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