如何在Angular 8的路由之间共享数据。
如何在Angular 8的路由之间共享数据。
我有一个JSON数据,在父组件中返回。您只需在父组件中输入数字"12233"或"34567",然后在控制台上可以看到数据被打印出来。
就像在子组件中,我想使用来自父组件的数据打印{{firstName}}。
有没有办法通过路由将数据属性传递给子组件,就像在这里的stackblitz中那样?
父组件:
HTML:
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
}
]
}
}
子组件:
HTML:
子组件工作了!{{firstName}}
在Angular 8中,如何在路由之间共享数据?
问题的原因是在不同的组件之间传递数据。解决方法是使用路由参数来传递数据,或者将数据保存在服务中。
首先,我们可以使用路由参数来传递数据。在上述示例中,可以使用queryParams来发送值,然后在子路由中检索它。具体代码如下:
goToChild(firstName) { this.router.navigate(['/child'], { skipLocationChange: true, queryParams: {firstName} }); } public firstName?: string; constructor(private activatedRoute: ActivatedRoute) { } ngOnInit() { this.activatedRoute.queryParamMap.subscribe(paramMap => this.firstName = paramMap.get('firstName')); }
如果要传递整个JSON数据,可以考虑将数据保存在一个服务中,然后只传递唯一的标识符。如果使用状态管理库,应该将对象保存在该库中,而不是服务中。示例代码如下:
// 保存数据的服务 @Injectable() export class DataService { private data: any; setData(data: any) { this.data = data; } getData() { return this.data; } } // 在组件中使用服务 constructor(private dataService: DataService) { } goToChild(data) { this.dataService.setData(data); this.router.navigate(['/child']); } // 在子组件中获取数据 public data: any; constructor(private dataService: DataService) { } ngOnInit() { this.data = this.dataService.getData(); }
希望以上解决方法能够帮助你解决在Angular 8中如何在路由之间共享数据的问题。如果还有其他问题,请随时提问。