typescript - Angular 4 Ako zdieľať premenné
Najprv načítavam komponentu aplikácie a na základe smerovania načítavam ostatné stránky.
Po načítaní prvej stránky chcem zdieľať premennú komponentu aplikácie s komponentom vyhľadávania. Oba sa načítavajú na prvej stránke. Ako to môžem urobiť?
change(lan) {
// I wanna send this lan variable to search component,
// this time search component loaded already in routing
}
Tok je takto:
Prvýkrát sa načítajú komponent vyhľadávania a komponent aplikácie.
Po tom zmením premennú.
To by malo byť pre mňa k dispozícii v komponente vyhľadávania.
HTML<router-outlet></router-outlet>
<div class="height-40 col-xs-12 bgcolor-EF bottom-panel">
<a href="javascript:void(0);" (click)="change('en')">English</a> | <a href="javascript:void(0);" (click)="change('pa')">Español</a>
</div>
TSchange(lan) {
}
Ako získať v komponente Hľadanie?
Odpoveď č. 1
Odporúčam vytvoriť službu pre váš prípad použitia. Na službu sa prihlásite v komponentne vyhľadávania a čakáte na aktualizácie. V komponentne aplikácie odošlete aktualizáciu do služby hneď, ako sa zmení jazyk. Toto využíva princíp observables, ktorý je veľkou súčasťou Angularu. V príklade som použil BehaviorSubject namiesto bežných Subjects/Observable, pretože vám poskytnú predvolenú hodnotu (alebo poslednú prijatú aktualizovanú hodnotu) hneď, ako sa prihlásite.
To sú základy:
LanService
export class LanService{
//default language
private lan:BehaviorSubject<string> = new BehaviorSubject<string>('en');
public getLan(){
return this.lan.asObservable();
}
public updateLan(lan){
this.lan.next(lan);
}
}
KomponentVyhľadávania
constructor(private ls:LanService){
this.ls.getLan().subscribe(lan => console.log(lan));
}
AppComponent
change(lan){
this.ls.updateLan(lan); //assuming you injected ls:LanService in constructor
}
Odpoveď č. 2
Existuje niekoľko metód, ktorými môžete dosiahnuť svoj želaný cieľ:
- Vytvorte zdieľanú službu (poskytnite ju v koreňovom module, aby ste mali iba jednu jej inštanciu), uložte na ňu vlastnosť a zdieľajte ju medzi komponentmi
- Použite nejaký druh systém obchodu, ako napríklad ngrx
- Použite
Input-y aOutput-y a upozornite na zmeny rodičovskú komponentu, aby ich zmenila pre všetky deti
Ktorékoľvek z týchto riešení bude fungovať, v závislosti od vašej úlohy si môžete vybrať ktorékoľvek z nich.
