【问题标题】:Get route query params获取路由查询参数
【发布时间】:2016-11-24 02:55:05
【问题描述】:

我正在尝试从 rc1 迁移到 rc4,但无法获取查询字符串参数。 ActivatedRoute 对象始终为空。

hero.component.ts

import {Component, OnInit} from "@angular/core";
import {Control} from "@angular/common";
import {ROUTER_DIRECTIVES, ActivatedRoute} from '@angular/router';

@Component({
    template: '../partials/main.html',
    directives: [ROUTER_DIRECTIVES]
})

export class HeroComponent implements OnInit {

    constructor(private _activatedRoute: activatedRoute) {

    }

    ngOnInit() {
        this._activatedRoute.params.subscribe(params => {
            console.log(params);
        });
    }
}

ma​​in.ts

import {bootstrap} from '@angular/platform-browser-dynamic';
import {HTTP_PROVIDERS, RequestOptions, Http} from '@angular/http';
import {AppRouterProviders} from './app.routes';

bootstrap(AppComponent, [
    AppRouterProviders,
    HTTP_PROVIDERS
]);

app.component.ts

import {Component, OnInit} from '@angular/core';
import {HeroComponent} from './hero.component';
import {RouteConfig, Router, ROUTER_DIRECTIVES} from '@angular/router';


@Component({
    selector: 'my-app',
    templateUrl: '../partials/main.html',
    directives: [
        HeroComponent,
        ROUTER_DIRECTIVES
    ]
})

export class AppComponent {
}

partials/main.html

<a class="nav-link" [routerLink]="['/']" [queryParams]="{st: 'new'}">New</a>

app.routes.ts

import {provideRouter, RouterConfig}  from '@angular/router';
import {HeroComponent} from './hero.component';
import {ErrorComponent} from './error.component';

const routes: RouterConfig = [
    {path:'', component: HeroComponent},
    {path:'**', component: ErrorComponent}
];

export const AppRouterProviders = [
    provideRouter(routes)
];

当我点击链接“新建”时,控制台打印出空对象

对象{}

更新

plunker

【问题讨论】:

    标签: typescript angular observable angular2-routing


    【解决方案1】:

    检查 Angular 文档,它都在那里: https://angular.io/docs/ts/latest/guide/router.html

    constructor(
      private route: ActivatedRoute,
      private router: Router,
      private service: HeroService) {}
    
        ngOnInit() {
          this.sub = this.route.params.subscribe(params => {
             let id = +params['id']; // (+) converts string 'id' to a number
             this.service.getHero(id).then(hero => this.hero = hero);
           });
    

    【讨论】:

    • 我之前尝试过,但在尝试获取查询字符串参数时未定义。 params 实际上是空对象。
    • 这是你传递参数的方式吗? onSelect(hero: Hero) { this.router.navigate(['/hero', hero.id]); }
    • 这样 [routerLink]="['/']" [queryParams]="{st: 'rec'}" 我想得到 st 参数
    • 那就试试新方法吧。你真的应该阅读文档上的这一部分。
    • 也许这是你缺少的部分,检查 hero 路由中的 id 参数: export const herosRoutes: RouterConfig = [ { path: 'heroes', component: HeroListComponent }, { path: 'hero/: id', 组件: HeroDetailComponent } ];
    【解决方案2】:

    更新(2.0.0 最终版)

    (somepath/:someparam/someotherpath) 你可以使用_router.queryParams.subscribe(...)订阅它们:

    export class HeroComponent implements OnInit {
      constructor(private _activatedRoute: ActivatedRoute, private _router:Router) {
        _activatedRoute.queryParams.subscribe(
          params => console.log('queryParams', params['st']));
    

    原创

    如果您想要 queryParams 而不是路由参数 (somepath/:someparam/someotherpath),您可以使用 _router.routerState.queryParams.subscribe(...) 订阅它们:

    export class HeroComponent implements OnInit {
      constructor(private _activatedRoute: ActivatedRoute, private _router:Router) {
        _router.routerState.queryParams.subscribe(
          params => console.log('queryParams', params['st']));
    

    Plunker example

    【讨论】:

    • 我喜欢你的回答,它按预期工作,但你可能知道为什么在我的 plunker 示例中我得到空的 ActivatedRoute 对象?只是好奇。
    • 我不明白你的问题。 “空”是什么意思? ActivatedRoute 被传入,否则 .params.subscribe() 会抛出。
    • ActivatedRoute 本身应该包含有关已激活组件的查询参数,但是当我订阅时我得到空对象。不知道如何更好地澄清。
    • 您能否发布一个更新的 Plunker 并使用 console.log(...) 打印您正在谈论的空对象?
    • 但是初始加载没有参数。你 Plunker 根本不使用paramsNew 链接使用queryParams,但只有在点击链接后才会传递。
    【解决方案3】:

    我为同样的问题苦苦挣扎了很长时间。 答案很棘手,在文档中指出:

    ActivatedRoute:为每个路由提供的服务 包含路由特定信息的组件,例如路由参数、静态数据、解析数据、全局查询参数和全局片段。 here中提到了这一点

    诀窍答案是'路由组件',这意味着ActivatedRoute 将仅适用于路由组件。换句话说,只有路由表中描述的组件。

    > 阅读混淆官方文档here。它提到了“与在插座中加载的组件关联的路由”。我们只能猜测什么是插座......

    我在独立的 app.module.ts 中编写了一些调查代码来研究这个问题:

    import { Component, NgModule } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    import { RouterModule, Routes, ActivatedRoute } from '@angular/router';
    
    @Component({
      selector: 'comp1',
      template: `<h4>comp1 works</h4>`,
    })
    export class Comp1 { }
    
    @Component({
      selector: 'comp2',
      template: `<h4>comp2 works</h4>`,
    })
    export class Comp2 { }
    
    @Component({
      selector: 'fail',
      template: `<div>Wrong URL:{{url | json}}</div> <h4>Failure page works</h4>`,
    })
    export class Fail {
      private url: any;
      constructor(public activeRoute: ActivatedRoute) {
        this.url = activeRoute.snapshot.url
      };
    
    }
    
    @Component({
      selector: 'app-root',
      template: `<div>Base URL:{{url | json}}</div> <router-outlet></router-outlet>`,
    })
    export class App {
      private url: any;
      constructor(public activeRoute: ActivatedRoute) {
        this.url = activeRoute.snapshot.url
      };
    }
    
    const appRoutes: Routes = [
      { path: '1', component: Comp1 },
      { path: '2', component: Comp2 },
      { path: '**', component: Fail }
    ];
    
    @NgModule({
      imports: [BrowserModule, RouterModule.forRoot(appRoutes)],
      declarations: [App, Comp2, Comp1, Fail],
      bootstrap: [App]
    })
    export class AppModule { }
    

    尝试为以下 URI 运行模块:

    祝你好运,希望代码具有示范性。

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2021-06-28
      • 2018-05-18
      • 2012-07-26
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多