Angular 2
Composants
Recherche…
Introduction
Les composants angulaires sont des éléments composés par un modèle qui rendra votre application.
Un composant simple
Pour créer un composant, nous ajoutons @Component
décorateur @Component
dans une classe transmettant certains paramètres:
-
providers
: ressources qui seront injectées dans le constructeur du composant -
selector
: le sélecteur de requête qui trouvera l'élément dans le HTML et le remplacera par le composant -
styles
:styles
ligne. NOTE: NE PAS utiliser ce paramètre avec require, cela fonctionne sur le développement mais quand vous construisez l'application en production tous vos styles sont perdus -
styleUrls
: Tableau de chemin d'accès aux fichiers de style -
template
: chaîne contenant votre code HTML -
templateUrl
: Chemin d'accès à un fichier HTML
Il y a d'autres paramètres que vous pouvez configurer, mais ceux qui sont listés sont ceux que vous utiliserez le plus.
Un exemple simple:
import { Component } from '@angular/core';
@Component({
selector: 'app-required',
styleUrls: ['required.component.scss'],
// template: `This field is required.`,
templateUrl: 'required.component.html',
})
export class RequiredComponent { }
Modèles et styles
Les modèles sont des fichiers HTML pouvant contenir une logique.
Vous pouvez spécifier un modèle de deux manières:
Passer le modèle en tant que chemin de fichier
@Component({
templateUrl: 'hero.component.html',
})
Passer un modèle en tant que code en ligne
@Component({
template: `<div>My template here</div>`,
})
Les modèles peuvent contenir des styles. Les styles déclarés dans @Component
sont différents de votre fichier de style d'application, tout ce qui est appliqué dans le composant sera limité à cette étendue. Par exemple, disons que vous ajoutez:
div { background: red; }
Toutes les div
dans le composant seront rouges, mais si vous avez d'autres composants, d'autres divs dans votre HTML, ils ne seront pas du tout modifiés.
Le code généré ressemblera à ceci:
Vous pouvez ajouter des styles à un composant de deux manières:
Passer un tableau de chemins de fichiers
@Component({
styleUrls: ['hero.component.css'],
})
Passer un tableau de codes en ligne
styles: [ `div { background: lime; }` ]
Vous ne devez pas utiliser de styles
avec require
car cela ne fonctionnera pas lorsque vous construirez votre application en production.
Test d'un composant
hero.component.html
<form (ngSubmit)="submit($event)" [formGroup]="form" novalidate>
<input type="text" formControlName="name" />
<button type="submit">Show hero name</button>
</form>
hero.component.ts
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { Component } from '@angular/core';
@Component({
selector: 'app-hero',
templateUrl: 'hero.component.html',
})
export class HeroComponent {
public form = new FormGroup({
name: new FormControl('', Validators.required),
});
submit(event) {
console.log(event);
console.log(this.form.controls.name.value);
}
}
hero.component.spec.ts
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { HeroComponent } from './hero.component';
import { ReactiveFormsModule } from '@angular/forms';
describe('HeroComponent', () => {
let component: HeroComponent;
let fixture: ComponentFixture<HeroComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [HeroComponent],
imports: [ReactiveFormsModule],
}).compileComponents();
fixture = TestBed.createComponent(HeroComponent);
component = fixture.componentInstance;
fixture.detectChanges();
}));
it('should be created', () => {
expect(component).toBeTruthy();
});
it('should log hero name in the console when user submit form', async(() => {
const heroName = 'Saitama';
const element = <HTMLFormElement>fixture.debugElement.nativeElement.querySelector('form');
spyOn(console, 'log').and.callThrough();
component.form.controls['name'].setValue(heroName);
element.querySelector('button').click();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(console.log).toHaveBeenCalledWith(heroName);
});
}));
it('should validate name field as required', () => {
component.form.controls['name'].setValue('');
expect(component.form.invalid).toBeTruthy();
});
});
Composants d'imbrication
Les composants s'affichent dans leur selector
respectif, vous pouvez donc l'utiliser pour imbriquer des composants.
Si vous avez un composant qui affiche un message:
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-required',
template: `{{name}} is required.`
})
export class RequiredComponent {
@Input()
public name: String = '';
}
Vous pouvez l'utiliser dans un autre composant en utilisant app-required
(le sélecteur de ce composant):
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-sample',
template: `
<input type="text" name="heroName" />
<app-required name="Hero Name"></app-required>
`
})
export class RequiredComponent {
@Input()
public name: String = '';
}