gpt4 book ai didi

angular - 无法从 App.Component 读取查询字符串参数

转载 作者:行者123 更新时间:2023-12-03 20:29:07 25 4
gpt4 key购买 nike

我想在整个应用程序中集中读取特定查询字符串参数的位置/方式,因此我认为最好的位置是在 app.component.ts 中

export class AppComponent implements OnInit, OnDestroy {
constructor(
private router: Router,
private activatedRoute: ActivatedRoute) {
}

然后,在 ngOnInit() ,我正在查看快照以及不同的订阅:
  ngOnInit(): void {
console.log('AppComponent - ngOnInit() -- Snapshot Params: ' + this.activatedRoute.snapshot.params['code']);
console.log('AppComponent - ngOnInit() -- Snapshot Query Params: ' + this.activatedRoute.snapshot.queryParams['code']);
console.log('AppComponent - ngOnInit() -- Snapshot Query ParamMap: ' + this.activatedRoute.snapshot.queryParamMap.get('code'));

this.activatedRouteParamsSubscription = this.activatedRoute.params.subscribe(params => {
console.log('AppComponent - ngOnInit() -- Subscription Params: ' + params['code']);
});

this.activatedRouteQueryParamsSubscription = this.activatedRoute.queryParams.subscribe(params => {
console.log('AppComponent - ngOnInit() -- Subscription Query Params: ' + params['code']);
});

this.activatedRoute.queryParamMap.subscribe(queryParams => {
console.log('AppComponent - ngOnInit() -- Subscription Query ParamMap: ' + queryParams.get('code'));
});

this.routerEventsSubscription = this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
console.log('AppComponent - ngOnInit() -- Subscription NavigationEnd: URL=', event.url);
}
});
}

如您所见,我已经为 params 设置了订阅。 , queryParams , queryParamMaprouter.events .

在页面导航之间触发的唯一一个是 router.events ,但在那里,我必须手动解析 URL 以获取查询字符串。

不确定这是否对其有任何影响,但我正在覆盖路由重用策略,因此即使页面在同一条路由上也会重新加载:
export class AppRoutingModule {
constructor(private router: Router) {
this.router.routeReuseStrategy.shouldReuseRoute = function() {
return false;
};
}
}

第一次访问时根页面的输出:
AppComponent - constructor() -- Snapshot Params: undefined
AppComponent - constructor() -- Snapshot Query Params: undefined
AppComponent - ngOnInit() -- Snapshot Params: undefined
AppComponent - ngOnInit() -- Snapshot Query Params: undefined
AppComponent - ngOnInit() -- Snapshot Query ParamMap: null
AppComponent - ngOnInit() -- Subscription Params: undefined
AppComponent - ngOnInit() -- Subscription Query Params: undefined
AppComponent - ngOnInit() -- Subscription Query ParamMap: null
AppComponent - ngOnInit() -- Subscription NavigationEnd: URL= /?code=logged-out

解决方案

正如@Thomaz 和@Nathan 所指出的,我的问题是 App.Component 不在 router-outlet 中。 .

此外,@Nathan 还指出:

You can access Router events and iterate over them wherever you want in the app though, which is why your router.events.subscribe(...) triggers.



然后我在我的路线上启用了跟踪:
RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload', enableTracing: true })

并看到 ActivationEnd事件包括 snapshot其中有 queryParams。最后,如果事件是 ActivationEnd,我将订阅路由器事件并处理我的查询字符串值。 .
this.router.events.subscribe(event => {
if(event instanceof ActivationEnd) {
const code = event.snapshot.queryParams['code'];
if (code) {
// handle it...
}
}
}

最佳答案

ActivatedRoute可以从通过 router-outlet 加载的组件订阅.自 AppComponent未通过任何 socket 加载,您无法订阅 ActivatedRoute其中的参数。重用策略对此没有影响。

来自文档 https://angular.io/api/router/ActivatedRoute我们知道以下几点:

[ActivatedRoute] Contains the information about a route associated with a component loaded in an outlet.



没有导出负载 AppComponent ,因此您的订阅不会触发。您可以访问路由器事件并在应用程序中的任何位置迭代它们,这就是为什么您的 router.events.subscribe(...)触发器。

关于angular - 无法从 App.Component 读取查询字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54316263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com