首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数更改GET请求后重新获取数据

参数更改GET请求后重新获取数据
EN

Stack Overflow用户
提问于 2019-05-23 05:30:38
回答 2查看 1.3K关注 0票数 2

如何通过单击将参数从: oglas/1更改为oglas/2后重新获取数据,因此当放置URL并单击ENTER everything时,但当单击oglas/2按钮时,当oglas/1呈现时,URL更改为oglas/2,但数据来自oglas/1?

TS

代码语言:javascript
复制
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Post } from "../post.model";
import { ServerService } from "../server.service";

@Component({
  selector: "post",
  templateUrl: "./post.component.html",
  styleUrls: ["./post.component.css"]
})
export class PostComponent implements OnInit {
  post: Post[];

  constructor(
    private route: ActivatedRoute,
    private serverService: ServerService
  ) {}

  ngOnInit(): void {
    this.getPost();
  }

  getPost(): void {
    const id = +this.route.snapshot.paramMap.get("id");
    this.serverService.getPosts(id).subscribe(post => (this.post = post));
  }
}

服务

代码语言:javascript
复制
import { HttpClient } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Post } from "./post.model";
import { User } from "./user.model";
import { Observable } from "rxjs";

@Injectable({ providedIn: "root" })
export class ServerService {
  usersUrl = "http://localhost:3000/users";
  postsUrl = "http://localhost:3000/posts";

  constructor(private http: HttpClient) {}

  getPosts(id: number | string): Observable<Post[]> {
    const url = `${this.postsUrl}/${id}`;
    return this.http.get<Post[]>(url);
  }

  getUser(id: number | string): Observable<User[]> {
    const url = `${this.usersUrl}/${id}`;
    return this.http.get<User[]>(url);
  }
}
EN

回答 2

Stack Overflow用户

发布于 2019-05-23 08:27:03

由于您正在对ngOnInit()中的数据进行API调用,因此所请求的数据在您的组件加载时可能不可用。并且Angular可能会重用组件的同一实例,使得ngOnInit()只能被调用一次。

您可以使用角度解析器来确保在加载组件之前具有所需的数据。

1)创建路由解析器,在加载路由前获取所需数据。

PostDataResolver.ts:

代码语言:javascript
复制
// ... imports

@Injectable()
export class PostDataResolver implements Resolve<any> {

 constructor(private serverService: ServerService) {}

 resolve(route: ActivatedRouteSnapshot) {

   const id = route.paramMap.get('id');

   return this.serverService.getPosts(id);
 }
}   

2)将此解析器添加到您的路由模块:

代码语言:javascript
复制
{ path: "oglas/:id", component: PostComponent, resolve: { postData: PostDataResolver }}

3)然后访问您的组件中解析的数据。

PostComponent.ts:

代码语言:javascript
复制
export class PostComponent implements OnInit {
  post: Post[];

  constructor(
    private route: ActivatedRoute,
    private serverService: ServerService
  ) {}

  ngOnInit(): void {
    this.post = this.route.snapshot.data.postData;
  }
}

这可确保在加载组件之前获得最新且适当的数据。

票数 1
EN

Stack Overflow用户

发布于 2019-05-23 23:53:37

明白了..。

代码语言:javascript
复制
import { Component, OnInit, OnChanges } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { Post } from "../post.model";
import { ServerService } from "../server.service";

@Component({
  selector: "post",
  templateUrl: "./post.component.html",
  styleUrls: ["./post.component.css"]
})
export class PostComponent implements OnInit {
  post: Post[];
  id: number;

  constructor(
    private route: ActivatedRoute,
    private serverService: ServerService
  ) {}

  ngOnInit(): void {
    this.route.paramMap.subscribe(params => {
      this.id = parseInt(params.get("id"));
      this.getPost(this.id);
    });
  }

  getPost(id: number): void {
    this.serverService.getPosts(id).subscribe(post => (this.post = post));
  }
}

此代码将数据重新获取到组件

代码语言:javascript
复制
ngOnInit(): void {
    this.route.paramMap.subscribe(params => {
      this.id = parseInt(params.get("id"));
      this.getPost(this.id);
    });
  }

感谢你们所有人的努力!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56265269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档