Angular - Data binding e Direttive incorporate

by NewPortal SuperAdmin on 14/02/2021

In questo articolo vedremo 1) l'assegnazione di valori, anche sotto forma di espressioni, a proprieta e attributi degli elementi html; 2) come mettersi in ascolto e rispondere agli eventi generati dalle azioni degli utenti; 3) L'uso delle direttive incorporate.

Interpolazione

L'interpolazione consente di visualizzare nel modello i valori delle proprietà di classe del componente. Nel modello i nomi delle proprietà vengono racchiusi tra parentesi graffe doppie{{}}. Sintassi nota come moustache syntax

// component.html
<p>Il mio nome è {{ name }}</p>
// Angular valuta prima l'espressione e poi trasforma in stringa
<p> Score count: {{ 1 + 1 }} </p>
// vengono considerati anche dei metodi
<p> {{ sum() }} </p>

// component ts
export class Component {
   name = 'Peter';

   sum() {
     return 1+1;
   }
}


Property Binding (associazione di proprietà)

La Property Binding consente di impostare dei valori per le proprietà degli elementi Html. Queste proprietà vengono racchiuse tra parentesi quadre ad indicare che l'elemento a destra dell'assegnazione sia considerato come una espressione dinamica. Quando si racchiude la proprietà tra parentesi quadre es. [hidden] stiamo manipolando la proprietà DOM e non l'attributo HTML


<img [src]="itemImageUrl" />
<tr><td [colSpan]="1 + 1">Prima cella</td></tr>

// si sta passando un valore alla proprietà childItem del componente figlio
<app-item-detail [childItem]="parentItem"></app-item-detail>

// in tal caso è possibile passare anche riferimenti a tag html ex ...<strong>prova</strong>
<span [innerHTML]="evilTitle"></span>


Attribute, class, and style bindings

// impostare uno stile - utilizzare [style.<nome-style>]
<h1 [style.color]="color" [style.font-size]="fontSize">Titolo news</h1>

// Multi-style binding
<h1 [style]="dimension">Titolo news</h1>

// impostare una classe - utilizzare [class.<nome-classe>]
<h1 [class.backcolor]="bkcolor">Titolo news</h1>

// Multi-class binding
<h1 [class]="espressionClass">Titolo news</h1>

// in taluni casi risulta necessario impostare un attributo. Usare [attr.<nome-attributo>]
<tr><td [attr.colspan]="1 + 1">Primo valore</td></tr>


Event Binding

Consente di ascoltare e rispondere alle azioni dell'utente. L'associazione avviene inserendo l'evento tra parentesi tonde () ad indicare che ci poniamo in ascolto di quel particolare evento. A destra dell'assegnazione si pone il codice js che sarà chiamato al verificarsi dell'evento.


// ci poniamo in ascolto dell'evento click
<button (click)="updateName()">Aggiornamento pulsante</button>

// altri eventi che possono essere gestiti
// (click), (mouseover), (keyup), (keyenter) e(change)

Possiamo anche gestire eventi personalizzati con EventEmitter

// definizione dell'evento nel componente figlio
@Output() deleteRequest = new EventEmitter<Item>();

delete() {
  this.deleteRequest.emit(this.item);
  ...
}

// inserimento del componente figlio nel modello del componente padre (es. list) 
// qui viene impostato il metodo padre che sarà invocato quando si verificherà 
// l'evento deleteRequest
<app-item-detail (deleteRequest)="deleteItem($event)" [item]="currentItem"></app-item-detail>


Two-way Binding

Con l'uso del two-way Binding ci si mette in ascolto ad un evento e simultaneamente si assegna un valore ad una proprietà. Utilizzando la direttiva ngModel si aggiunge il data binding bidirezionale ad un elemento del modulo HTML (L'uso della direttiva ngModel sarà vista più avanti).

// si utilizza contemporaneamente parentesi quadre e tonde
<app-sizer [(size)]="fontSizePx"></app-sizer>


Variabili di riferimento del modello

// viene definita una variabile #phone che fa riferimento all'input
<input #phone placeholder="phone number" />

// nello stesso modello posso far riferimento alla variabile per ricavarne il valore
<button (click)="callPhone(phone.value)">Call</button>


Direttive incorporate su proprietà e attributi

// direttiva [ngClass] se isSpecial è vera setta la classe special
<div [ngClass]="isSpecial ? 'special' : ''">Direttiva ngClass</div>

// settaggio diretto delle classi
<div [ngClass]="{modified: true, special:  true}">Settaggio classi</div>

// settaggio diretto degli stili  
<div [ngStyle]="{'font-style': italic, 'font-weight': 'bold'}">Settaggio stili</div>

// Come già detto precedentemente con l'uso della direttiva ngModel 
// si aggiunge il data binding bidirezionale ad un elemento del modulo HTML.
// per utilizzare la direttiva importiamo FormsModule in AppModule 
// import { FormsModule } from '@angular/forms';
<input [(ngModel)]="currentItem"><h1>{{ currentItem }}</h1>


Direttive strutturali incorporate

// non visualizza il tag <div> su null e false - isActive = false;
<div *ngIf="isActive">Hello, <span>Visualizza su true</span></div>

// ripete un ciclo sugli elementi di un array - es. items = [{name:'Vito'},{..},{..}]; 
<div *ngFor="let item of items; let i=index; let pari = even; let dispari = odd">{{item.name}}</div>

// utile è l'uso dell'elemento <ng-container> nel caso non avessimo tag di riferimento
<ng-container *ngIf="isActive">{{item.name}}</ng-container>

// visualizza un elemento tra diversi elementi possibili
<div [ngSwitch]="currentItem">
  <app-stout-item *ngSwitchCase="'stout'" [item]="currentItem"></app-stout-item>
  <app-device-item *ngSwitchCase="'slim'" [item]="currentItem"></app-device-item>
  <app-unknown-item *ngSwitchDefault [item]="currentItem"></app-unknown-item>
</div>

Con l'uso del comando ng generate directive possiamo creare direttive personali e utilizzarle nelle nostre applicazioni.

Send Comment