javascript - hur man delar data mellan rutter i angular 8
Jag har en JSON-data som returneras när den är i föräldrakomponenten. Allt du behöver göra är att skriva numren "12233" eller "34567" på föräldrakomponenten så kan du se datan skrivas ut i konsolen.
Som i ett barn vill jag skriva ut {{firstName}} från användning av datan från Förälder.
Finns det ett sätt att dataattribut kan skickas till Child-komponenten med hjälp av rutterna som i stackblitzen här
Förälder: HTML:
<button class="btn-thumbnail">type the secret number to pass</button>
<!-- "number": 12233
or
"number": 34567 -->
TS :
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import data from '../data.json';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {
constructor(private router: Router) {
document.addEventListener('keypress', this.secretNumber);
}
typed = '';
firstName : any = {};
secretNumber = event => {
this.typed += String.fromCharCode(event.keyCode);
let eraseData = [];
let matchedData = {};
if (this.typed.length == 5) {
Object.keys(data).length > 0 &&
data.items && data.items.userdata.map((item, i) => {
if(item.number == this.typed) {
matchedData = item;
console.log(item);
this.firstName = item.firstName;
console.log(this.firstName);
this.goToChild();
return matchedData;
}
if (item.number != this.typed) {
eraseData.push(item);
}
return eraseData;
});
if (Object.keys(matchedData).length == 0 && eraseData.length > 0 && this.typed.length == 5) {
this.typed = '';
}
}
};
ngOnDestroy() {
document.removeEventListener('keypress', this.secretNumber);
}
ngOnInit() {
}
goToChild() {
this.router.navigate(['/child'], { skipLocationChange: true });
}
}
Data.JSON:
{
"items": {
"userdata": [
{
"firstName": "john",
"lastName": "doe",
"number": 12233
},
{
"firstName": "mary",
"lastName": "jane",
"number": 34567
}
]
}
}
Barn: HTML:
<p>
child works! {{firstName}}
</p>
Stackblitz
Svar #1
Visst, det fungerar precis som i ditt exempel.
Skicka värdet som en queryParam så här:
goToChild(firstName) {
this.router.navigate(['/child'], { skipLocationChange: true, queryParams: {firstName} });
}
Och hämta det sedan på child-route på detta sätt:
public firstName?:string;
constructor(
private activatedRoute:ActivatedRoute
) { }
ngOnInit() {
this.activatedRoute.queryParamMap.subscribe(paramMap => this.firstName = paramMap.get('firstName'));
}
Här är den fungerande StackBlitz.
Skicka objekt
Om du vill skicka ett objekt är det bästa sättet att hålla objektet i en tjänst och bara skicka en unik identifierare via ovanstående metod. Om du använder ett tillståndshanteringsbibliotek bör du hålla ditt objekt där istället för i tjänsten.
Jag gjorde en annan StackBlitz som visar detta med ditt exempel (jag städade också upp koden lite för att göra det lättare att se).
