Angular 2                
            componenti
        
        
            
    Ricerca…
introduzione
I componenti angolari sono elementi composti da un modello che renderà la tua applicazione.
Un componente semplice
 Per creare un componente, aggiungiamo @Component decorator in una classe che passa alcuni parametri: 
-  providers: risorse che verranno iniettate nel costruttore del componente
-  selector: il selettore di query che troverà l'elemento nell'HTML e lo sostituirà con il componente
-  styles:stylesincorporati. NOTA: NON utilizzare questo parametro con require, funziona sullo sviluppo ma quando si crea l'applicazione in produzione tutti i tuoi stili vengono persi
-  styleUrls: matrice del percorso per i file di stile
-  template: stringa che contiene il tuo HTML
-  templateUrl: percorso di un file HTML
Ci sono altri parametri che puoi configurare, ma quelli elencati sono quelli che userai di più.
Un semplice esempio:
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 { }
Modelli e stili
I modelli sono file HTML che possono contenere logica.
Puoi specificare un modello in due modi:
Passando il modello come percorso del file
@Component({
  templateUrl: 'hero.component.html',
})
Passare un modello come codice in linea
@Component({
  template: `<div>My template here</div>`,
})
 I modelli possono contenere stili. Gli stili dichiarati in @Component sono diversi dal file di stile dell'applicazione, qualsiasi cosa applicata nel componente sarà limitata a questo ambito. Ad esempio, supponi di aggiungere: 
div { background: red; }
 Tutte le div all'interno del componente saranno rosse, ma se hai altri componenti, altre div nel tuo codice HTML non saranno affatto cambiate. 
Il codice generato sarà simile a questo:
Puoi aggiungere stili a un componente in due modi:
Passando una serie di percorsi di file
@Component({
  styleUrls: ['hero.component.css'],
})
Passando una serie di codici in linea
styles: [ `div { background: lime; }` ]
 Non si dovrebbero usare gli styles con require in quanto non funzionerà quando si costruisce l'applicazione in produzione. 
Test di un componente
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();
  });
});
Componenti di nidificazione
 I componenti verranno visualizzati nel rispettivo selector , quindi è possibile utilizzarli per nidificare i componenti. 
Se hai un componente che mostra un messaggio:
import { Component, Input } from '@angular/core';
@Component({
  selector: 'app-required',
  template: `{{name}} is required.`
})
export class RequiredComponent {
  @Input()
  public name: String = '';
}
 Puoi usarlo all'interno di un altro componente usando app-required (il selettore di questo componente): 
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 = '';
}
