【问题标题】:How to configure route parameter on Angular application root URL如何在 Angular 应用程序根 URL 上配置路由参数
【发布时间】:2018-12-06 03:39:17
【问题描述】:

看起来很简单...我的 app.module 看起来像这样:

const appRoutes: Routes = [
  { path: '', component: AppComponent },
  { path: ':config', component: AppComponent }
];


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    RouterModule.forRoot(appRoutes)
  ],
  providers: [],
  bootstrap: [AppComponent]
})

app.component 代码如下所示:

constructor(private route: ActivatedRoute) {

  }

  config: string;

  ngOnInit() {
    this.config = this.route.snapshot.params['config'];
  }

我希望能够执行诸如点击http://localhost:4200/english 之类的操作并将配置属性设置为“english”...但是 this.route.snapshot.params['config'] 每次都未定义。

任何帮助表示赞赏。

【问题讨论】:

  • 试试this.route.params.subscribe(params => { this.config =params['config']})

标签: angular parameters routing


【解决方案1】:

实际上,您在 ngOnInit() 上提取参数的方式并没有错,但是您错过放置路由器插座的方式有问题(我的假设)。

应用组件

AppComponent 是处理所有子路由的根 (router-outlet)。

如果您正在获取路由参数并且您的 AppComponent 的模板只是一个没有 <router-outlet> 的纯 HTML,那么您的 this.route.snapshot.params['config']; 将变为 undefined

@Component({
  selector: 'app-root',
  template: `I am AppComponent`        // Plain Template without <router-outlet>
})
export class AppComponent {...}

但是如果您将&lt;router-outlet&gt; 放置在您的AppComponent 的模板上,那么您的this.route.snapshot.params['config']; 将有一个值,如果传递的配置参数是'/english',那么它的快照参数值为'英语'

@Component({
  selector: 'app-root',
  template: `
     <h1>{{ config }}</h1>
     <router-outlet></router-outlet>     // Add router-outlet
  `        
})
export class AppComponent implements OnInit {

    config: string;

    constructor(private route: ActivatedRoute) {}

    ngOnInit() {
       this.config = this.route.snapshot.params['config'];    // 'english' if the url has a supplied param of /english 
    }

}

已创建Stackblitz Demo 供您参考

演示输出

【讨论】:

  • 非常感谢!我注意到我自己的代码中有一个微妙之处……我使用的是 templateURL 而不是模板,并且在相应的模板 html 文件中,将路由器插座放在哪里似乎很重要。如果我将路由器插座放在顶部,一切都会按预期工作。如果我把它放在它应该设置的变量的引用之后(在这种情况下是'config'),它就不起作用。再次感谢!
  • 嗨@IvanPelly,欢迎您。如果我的回答可以帮助您解决您的问题。介意您是否将其标记为已接受的答案?那将是一个很大的帮助。非常感谢。
  • 嗨@KShewengger - 再次感谢!我多玩了一点 Stackblitz 演示,除非我误解了它,否则我不再 100% 相信它是正确的。在演示中,我执行了以下操作:1)从 app.component.html 中删除所有标记(不需要),2)在 app.component.ts 中 之前的行中键入“hello” 3)追加'/test' 到右侧窗格中的 URL。当测试页面加载时,'Hello' 会重复两次。我敢打赌,这与组件是它自己的路由器插座有关,但我还没有完全弄清楚是什么让它工作。
  • 你好,当我使用 templateUrl 时,我得到了重复的响应.. 你能解决它吗
  • 您好,为了避免您在 AppComponent 中分配的自定义模板以及路由器插座上出现重复响应,我们必须将其分隔在另一个组件或 url 上,因为重复被触发,因为我们已经制作了“AppComponent”作为我们的主要组件,我们已将其配置为放在 AppModule NgModule “bootstrap: [AppComponent]”中的“bootstrap”配置中。与其他未引导的组件不同,它不会重复您的响应。
猜你喜欢
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
相关资源
最近更新 更多