gpt4 book ai didi

angular - 如何从 ParamMap 中获取路由参数并将其分配给属性

转载 作者:太空狗 更新时间:2023-10-29 17:42:25 26 4
gpt4 key购买 nike

我正在使用 RxJs 6 运行 Angular 6。

我正在尝试从 paramMap 中获取值并将其分配给属性。路线如下所示:

{
path: 'post/:postName',
component: PostComponent
}

post 组件目前看起来像这样:

import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, ParamMap } from '@angular/router';
import { switchMap } from 'rxjs/operators';
import { Observable, of } from 'rxjs';
import * as matter from 'yaml-front-matter';
import { Post } from '../../models/post';

@Component({
selector: 'blog-post',
templateUrl: './post.component.html',
styleUrls: ['./post.component.css'],
encapsulation: ViewEncapsulation.Emulated
})
export class PostComponent implements OnInit {
created: Date;
postName = '';
markdown = '';
title = '';
loading = true;
author = '';

constructor(private route: ActivatedRoute) { }

async ngOnInit () {
this.route.paramMap.pipe(
switchMap((params: ParamMap) =>
of(params.get('postName'))
)
).subscribe(d => this.postName = d);

const file = await fetch(`/_posts/${this.postName}.md`);
const text = await file.text();
const content = text.trim();
this.parseFrontMatter(content);
}

parseFrontMatter (content: string) {
const frontMatter: Post = matter.loadFront(content);
this.title = frontMatter.title;
this.author = frontMatter.author;
this.created = frontMatter.created;
this.markdown = frontMatter.__content;
this.loading = false;
}
}

在 ngOnInit 中是从 paramMap 中获取值的代码。除非您尝试使用不同的参数路由回 post 组件,否则此代码有效。

这可以在 Devbin.io 观察到.

  1. 导航到帖子页面
  2. 点击唯一的帖子
  3. 现在尝试导航到关于页面,这只是另一篇文章。
  4. 请注意,即使更新了 Url,它也不会路由到“关于”页面。

可以在 GitHub 上找到完整的源代码

所有文档和其他 Stack Overflow 答案始终假定您要在 switchMap 函数中调用服务。官方文档是here

我的问题是如何获取路线参数并将其分配给属性并在导航回同一路线时保持导航正常工作?

最佳答案

这是因为当您路由到同一组件时,不会调用 ngOnInit。在您的情况下,/post/Angular-6-Router-How-To-Get-Route-Parameters 和/post/About 触发相同的组件:post.component。

因此,为了完成这项工作,您可以在 paramMap.pipe 中调用订阅内的函数。

你可以这样做:

ngOnInit() {
this.route.paramMap.pipe(
switchMap((params: ParamMap) =>
of(params.get('postName'))
)
).subscribe((d) => {
this.postName = d;
this.postInit();
});

}

async postInit() {
const file = await fetch(`/_posts/${this.postName}.md`);
const text = await file.text();
const content = text.trim();
this.parseFrontMatter(content);
}

parseFrontMatter(content: string) {
const frontMatter: Post = matter.loadFront(content);
this.title = frontMatter.title;
this.author = frontMatter.author;
this.created = frontMatter.created;
this.markdown = frontMatter.__content;
this.loading = false;
}

关于angular - 如何从 ParamMap 中获取路由参数并将其分配给属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705214/

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