Directives
A directive is a class with a @Directive
decorator.
There are two kinds of directives besides components: structural and attribute directives. You can apply many attribute directives to one host element. You can only apply one structural directive to a host element.
Just as for components, the metadata for a directive associates the class with a selector that you use to insert it into HTML. In templates, directives typically appear within an element tag as attributes, either by name or as the target of an assignment or a binding.
A component is technically a directive. It's a directive with a template.
Components are so distinctive and central to Angular applications that Angular defines the @Component decorator, which extends the @Directive decorator with template-oriented features.
Structural directives
Structural directives alter layout by adding, removing, and replacing elements in DOM. The example template uses two built-in structural directives to add application logic to how the view is rendered:
<li *ngFor="let hero of heroes"></li>
<app-hero-detail *ngIf="selectedHero"></app-hero-detail>
<p *ngIf="heroes.length > 3">There are many heroes!</p>
You can only apply one structural directive to an element.
Use
<ng-container>
to group elements when there is no suitable host element for the directive, or when you need both an *ngFor and an *ngIf on the same host elementStructural directives can be desugared into the <ng-template> element form. See NgIf
Built-it structural directives
*ngFor
is an iterative; it tells Angular to stamp out one <li> per hero in the heroes list.*ngIf
is a conditional
The
ngIf
directive doesn't hide elements with CSS. It adds and removes them physically from the DOM.it includes the HeroDetail component only if a selected hero exists.
*ngSwitch
[R] https://angular.io/guide/template-syntax#built-in-structural-directives
[R] https://angular.io/guide/structural-directives
Attribute directives
Attribute directives alter the appearance or behavior of an existing element. In templates they look like regular HTML attributes, hence the name.
<input [(ngModel)]="hero.name">
<div [style.font-size]="isSpecial ? 'x-large' : 'smaller'" >
This div is x-large or smaller.
</div>
<div [class.special]="isSpecial">The class binding is special</div>
Built-in attribute directives
ngModel
two-way data binding:
is an example of an attribute directive. ngModel modifies the behavior of an existing element (typically an <input>) by setting its display value property and responding to change events.
[R] https://angular.io/guide/template-syntax#built-in-attribute-directives
[R] https://angular.io/guide/attribute-directives
ng-container
The <ng-container> is a syntax element recognized by the Angular parser.
It's not a directive, component, class, or interface.
<p>
I turned the corner
<ng-container *ngIf="hero">
and saw {{hero.name}}. I waved
</ng-container>
and continued on my way.
</p>
<div>
Pick your favorite hero
(<label><input type="checkbox" checked (change)="showSad = !showSad">show sad</label>)
</div>
<select [(ngModel)]="hero">
<ng-container *ngFor="let h of heroes">
<ng-container *ngIf="showSad || h.emotion !== 'sad'">
<option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
</ng-container>
</ng-container>
</select>
Last updated
Was this helpful?