Visão geral do componente Angular List View
O componente Ignite UI for Angular List exibe linhas de itens e suporta um ou mais itens de cabeçalho, bem como pesquisa e filtragem de itens de lista. Cada item de lista é completamente modelável e suporta qualquer componente HTML ou Angular válido. O componente de lista também fornece funcionalidade de panorâmica integrada, modelos para estados vazios e de carregamento e suporta virtualização para listas grandes usando a diretiva IgxForOf
.
Angular List Example
O exemplo a seguir representa uma lista preenchida com contatos com propriedades de nome e número de telefone. O componente IgxList
usa igx-avatar
e igx-icon
para enriquecer a experiência do usuário e expor os recursos de configuração de imagem de avatar e ícone diferente para favoritar um contato. Além disso, a List View expõe recursos de classificação obtidos usando nosso pipe de filtragem.
Getting Started with Ignite UI for Angular List
Para começar a usar o componente Ignite UI for Angular List View, primeiro você precisa instalar Ignite UI for Angular. Em um aplicativo Angular existente, digite o seguinte comando:
ng add igniteui-angular
Para obter uma introdução completa ao Ignite UI for Angular, leia o tópico de introdução.
O próximo passo é importar o IgxListModule
no arquivo app.module.ts.
Note
Este componente pode utilizar o HammerModule
opcionalmente. Ele pode ser importado no módulo raiz do aplicativo para que as interações por toque funcionem conforme o esperado.
// 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 {}
Como alternativa, a partir da 16.0.0
, você pode importar o IgxListComponent
como uma dependência autônoma ou usar o token IGX_LIST_DIRECTIVES
para importar o componente e todos os seus componentes e diretivas de suporte.
// 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 {}
Agora que você importou o módulo Ignite UI for Angular List ou as diretivas, você pode começar a usar o componente igx-list
.
Using the Angular List
Então, no template do nosso componente contacts podemos criar nossa lista, mas e se atualmente (ou em algum momento no futuro) não tivermos itens nela? Nesse caso, a lista Angular nos fornece um template padrão que é usado quando a lista está vazia. Podemos sempre fornecer nosso próprio template para a aparência da nossa lista vazia simplesmente usando a diretiva igxEmptyList
. Nesse caso, o template padrão não será usado:
<!--contacts.component.html-->
<igx-list>
<ng-template igxEmptyList>
<p class="empty">No contacts! :(</p>
</ng-template>
</igx-list>
E nosso estilo para o modelo vazio:
/* 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);
}
Se tudo correr bem, é assim que nossa lista vazia deve ficar:
Às vezes, pode haver um atraso no carregamento de seus dados. Nesse caso, você pode definir a propriedade isLoading
da lista como true
e um modelo padrão informará o usuário sobre o processo de carregamento de dados em andamento. Você também pode fornecer seu próprio modelo de carregamento usando a diretiva 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
É legal ter um modelo para quando a lista estiver vazia, mas agora vamos adicionar alguns itens! Podemos adicionar o seguinte código para obter uma lista simples de itens:
<!--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>
Se tudo correr bem, você deverá ver o seguinte no seu navegador:
Vamos melhorar um pouco o nosso jogo e aprimorar os itens da nossa lista. Digamos que queremos criar uma lista Angular de contatos com um nome e um número de telefone exibidos abaixo do nome. Em nosso arquivo typescript do componente, podemos definir uma lista de contatos:
// 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"
}];
Agora que temos alguns dados que queremos renderizar, vamos configurar alguma marcação. Se quisermos algum estilo pronto para uso, podemos usar algumas das diretivas que vêm com os itens da lista.
Vejamos como podemos usar alguns deles no próximo exemplo:
<!--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 as diretivas igxListLineTitle
e igxListLineSubTitle
dão aos itens da nossa lista uma aparência padrão.
Depois de tudo isso, nossa lista Angular deve ficar assim:
Adding Avatar and Icons
Podemos usar alguns dos nossos outros componentes em conjunto com o componente IgxList
para enriquecer a experiência e adicionar alguma funcionalidade. Podemos ter um avatar de imagem legal à esquerda dos valores de nome e telefone. Além disso, podemos adicionar um ícone de estrela à direita deles para permitir que o usuário favorite um contato. Para fazer isso, vamos pegar os módulos IgxAvatar e IgxIcon e importá-los em nosso arquivo 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 {}
Em seguida, precisamos adicionar mais algumas informações ao nosso objeto de contato, como uma fonte photo
para nosso avatar e uma propriedade isFavorite
para indicar o status favorito do contato.
// 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
}];
Legal, agora vamos atualizar o template para nossa lista de contatos para mostrar o avatar e o ícone. Novamente, podemos fazer isso usando algumas das diretivas 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
deve ser usado se precisarmos adicionar algum tipo de mídia no início dos itens da nossa lista. A diretiva envolverá o elemento alvo no nosso caso igx-avatar em um contêiner que fornecerá alguma posição e espaçamento padrão.igxListAction
deve ser usado para itens de lista que tenham algum tipo de ação ou metadados, por exemplo, switch, radio-button, checkbox, etc. No nosso caso, a ação será representada por umigx-icon
. Novamente, a diretiva envolverá o elemento alvo em um contêiner que terá a posição e o espaçamento corretos.igxListLine
deve ser usado se precisarmos de algum texto entreigxListThumbnail
eigxListAction
A diretiva garantirá que a posição, o espaçamento e o alinhamento do texto ficarão ótimos com as outras duas diretivas ao redor.
Em seguida, ouvimos um evento de clique no componente IgxIcon para alternar a propriedade isFavorite em nosso objeto de contato.
// contacts.component.ts
...
toggleFavorite(item: IgxListItem) {
const contact = this.contacts[item.index - 1];
contact.isFavorite = !contact.isFavorite;
}
Vamos também permitir que o usuário escolha o tamanho da lista usando a propriedade personalizada CSS--ig-size
. Faremos isso importando o IgxButtonGroupModule
e usando o IgxButtonGroup para exibir todos os valores de tamanho. Dessa forma, sempre que um for selecionado, atualizaremos o tamanho da 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})`;
}
E aqui está o resultado de todo esse trabalho:
List Items Panning
Agora que temos uma lista Angular tão bonita com contatos e seus números de telefone, por que não implementamos uma habilidade de chamar um contato? O IgxList
tem a solução perfeita para isso - lista de itens de panning. Para fazer isso, você tem que implementar os seguintes passos:
- Habilite o panning usando as propriedades
allowLeftPanning
e/ouallowRightPanning
- Definir modelo(s) para a panorâmica esquerda e/ou direita
- Manipule os eventos de panorâmica do item da lista e execute a ação desejada
O exemplo a seguir demonstra como lidar com o panning esquerdo e direito. O manipulador de eventos para o panning direito mostra uma mensagem toast. O manipulador de eventos para o panning esquerdo exclui um item da IgxList
.
Note
Observe que a remoção de itens da lista é uma tarefa de aplicativo. O IgxList
em si não pode remover itens da fonte de dados porque o IgxList
não tem referência à fonte de dados.
Aqui está o código HTML do exemplo:
<!-- 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>
O exemplo acima usa alguns estilos CSS que podem ser encontrados aqui:
/* 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;
}
E finalmente aqui está o código typescript que manipula os 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
Ao fazer o panning de itens de lista, há um limite que deve ser atingido para que os eventos de panning sejam emitidos. Você pode alterar o limite usando a propriedade panEndTriggeringThreshold
do IgxList
. Por padrão, essa propriedade tem um valor de 0,5, o que significa 50% da largura do item da lista.
Agora tente você mesmo analisar os itens da lista:
Angular filter list
Nossa lista está ótima, mas não seria ainda melhor se pudéssemos procurar contatos por nome? Podemos fazer isso facilmente usando nosso pipe de filtragem. Vamos fazer isso.
Vamos primeiro adicionar um campo de entrada no topo do nosso modelo de componente Angular e vinculá-lo a uma propriedade em nosso componente chamada 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>
É hora de importar o IgxFilterModule
e o IgxInputGroupModule
em nosso arquivo app.module.ts e IgxFilterOptions
em nosso componente de contatos:
// 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;
}
}
Após importar o IgxFilterOptions
, precisamos registrar um novo método getter que retornará as opções de filtragem a serem usadas pelo pipe sempre que a propriedade searchContact
for atualizada. Para que o filtro funcione, precisamos registrar uma key
para filtrar o objeto de contato. No nosso caso, seria o name
de cada contato. A segunda propriedade que precisa ser registrada no objeto IgxFilterOptions
é o valor que devemos verificar ao comparar nosso nome de contato. Esta seria a propriedade searchContact
que vinculamos ao campo de entrada acima da nossa lista de contatos.
Por fim, precisamos aplicar o pipe de filtragem aos nossos dados de contatos antes de podermos usá-lo. Então, em nosso modelo, simplesmente adicionamos:
<!--contacts.component.html-->
<igx-list-item *ngFor="let contact of contacts | igxFilter: filterContacts; let i = index">
...
</igx-list-item>
List Item Selection
Como você provavelmente já notou, itens de lista não fornecem estados de seleção. No entanto, se seu aplicativo requer que sua lista mantenha o controle de qual item é selecionado, nós lhe damos um exemplo de como isso pode ser alcançado. Tudo o que você precisa fazer é manter o controle do estado em algum lugar em seu componente, ou nos dados aos quais a lista está vinculada.
Aqui está um exemplo, no qual aplicamos uma cor de fundo à lista de acordo com a cor secundária 500 do tema, com base no rastreamento de estado proveniente dos dados aos quais a lista está vinculada:
O que estamos fazendo é adicionar uma propriedade selected
adicional a cada membro de dados, cujo padrão é false
. Ao clicar no item da lista, estamos redefinindo todas as propriedades selected
na coleção de dados e definindo a correspondente ao item clicado como true
. Com base na propriedade selecionada, estamos aplicando uma classe css ao item da lista que dá a ele o plano de fundo selecionado.
<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))
}
Chat Component
O exemplo a seguir demonstra como criar um componente de bate-papo simples usando IgxList.
Applying theme to the list component
Vamos ver como podemos mudar o fundo da nossa lista. Primeiro precisamos importar index.scss para o nosso arquivo .scss do componente.
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Seguindo a abordagem mais simples, criamos um novo tema que estende o list-theme
e aceita o parâmetro $background
.
$my-list-theme: list-theme(
$background: #0568ab
);
Dê uma olhada na seção list-theme
para obter uma lista completa de parâmetros disponíveis para estilizar a lista.
A última etapa é incluir os temas recém-criados.
@include css-vars($my-list-theme);
O resultado é o seguinte:
Para uma lista completa de parâmetros que você pode alterar para o componente de lista, consulte: Estilos IgxListComponent
API References
Neste artigo, cobrimos muito terreno com o componente de lista Angular. Criamos uma lista de itens de contato. Usamos alguns componentes adicionais Ignite UI for Angular dentro dos nossos itens de lista, como avatares e ícones. Criamos alguns layouts de itens personalizados e os estilizamos. Por fim, adicionamos filtragem de lista. O componente de lista tem mais algumas APIs para explorar, que estão listadas abaixo.
Componentes Angular adicionais que foram usados:
- API do componente IgxAvatar
- Estilos de componentes IgxAvatar
- API do IgxIconComponent
- Estilos IgxIconComponent