ChatGPT解决这个技术问题 Extra ChatGPT

通过 Angular 中的路由路径发送数据

无论如何要使用 router.navigate 将数据作为参数发送?我的意思是,像 this 这样的例子,你可以看到路由有一个 data 参数,但是这样做是行不通的:

this.router.navigate(["heroes"], {some-data: "othrData"})

因为 some-data 不是有效参数。我怎样才能做到这一点?我不想用 queryParams 发送参数。

我认为它应该是像 AngularJS 中的其他方式,我们可以在其中做类似 $state.go('heroes', {some-data: "otherData"}) 的事情
使用我的方法npmjs.com/package/ngx-navigation-with-data我最后的评论,最适合所有人

N
Nasta

关于这个话题有很多困惑,因为有很多不同的方法可以做到这一点。

以下是以下屏幕截图中使用的适当类型:

private route: ActivatedRoute
private router: Router

1) 所需的路由参数:

https://i.stack.imgur.com/WJGO8.png

2) 路由可选参数:

https://i.stack.imgur.com/T1TPO.png

3) 路由查询参数:

https://i.stack.imgur.com/xbX48.png

4)您可以使用服务将数据从一个组件传递到另一个组件,而根本不使用路由参数。

有关示例,请参见:https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

我在这里有一个 plunker:https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


谢谢您的回答! 2)和3)有什么区别?因为两者最终都在 URL 中添加了“?parameter=”。你能给我举个4)的例子吗?我不知道该怎么做。
我更新了答案以显示不同的 URL,并提供指向博客文章的链接以及如何通过服务传递数据的 plunker。 URL 与可选参数和查询参数不同,如上所示。 Plus 查询参数可以跨路由保留。
我还有一门关于路由的 Pluralsight 课程,涵盖了所有这些内容:app.pluralsight.com/library/courses/angular-routing/…如果您有兴趣了解更多信息,可以免费注册一周。
数据仅在正在执行的应用程序中“共享”。如果用户刷新页面,整个应用程序将从服务器重新加载,因此应用程序中不会保留先前的状态。从普通应用程序的角度考虑,当用户刷新时,它就像关闭和重新打开应用程序一样。如果您需要在刷新后保留状态,则需要将其存储在某个地方,例如本地存储或服务器上。
只是一个小提示:route 类型是 ActivatedRoute,而不是 Router
A
Akash Kumar Verma

Angular 7.2.0 附带了一种新方法

https://angular.io/api/router/NavigationExtras#state

发送:

    this.router.navigate(['action-selection'], { state: { example: 'bar' } });

收到:

    constructor(private router: Router) {
      console.log(this.router.getCurrentNavigation().extras.state.example); // should log out 'bar'
    }

你可以在这里找到一些额外的信息:

https://github.com/angular/angular/pull/27198

上面的链接包含这个有用的示例:https://stackblitz.com/edit/angular-bupuzn


鉴于 Angular 7 中的新功能,这是正确的答案。
使用这种方法,我将如何处理用户刷新浏览器?在这种情况下,附加导航中的数据似乎消失了,因此在刷新时没有机会再次使用它。
是的,这就是为什么您只能从构造函数中的 this.router.getCurrentNavigation() 获取数据的原因。如果您在其他地方需要它,例如在 ngOnInit() 内部,您可以通过“history.state”访问数据。从文档中:“状态传递给任何导航。在执行导航时,可以通过从 router.getCurrentNavigation() 返回的附加对象访问此值。导航完成后,该值将在定位时写入 history.state .go 或 location.replaceState 方法在激活这条路线之前被调用。”
还要确保您不要尝试将 ngOnInit() 中的附加对象作为 this.router.getCurrentNavigation().extras 接收
@KinleyChristian 查看这个答案,如果您还有其他问题,请告诉我! stackoverflow.com/a/54891361/4222504
d
dev-nish

最新版本的 Angular (7.2 +) 现在可以选择使用 NavigationExtras 传递附加信息。

主页组件

import {
  Router,
  NavigationExtras
} from '@angular/router';
const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};
this.router.navigate(['newComponent'], navigationExtras);

新组件

test: string;
constructor(private router: Router) {
  const navigation = this.router.getCurrentNavigation();
  const state = navigation.extras.state as {
    transId: string,
    workQueue: boolean,
    services: number,
    code: string
  };
  this.test = "Transaction Key:" + state.transId + "<br /> Configured:" + state.workQueue + "<br /> Services:" + state.services + "<br /> Code: " + state.code;
}

输出

https://i.stack.imgur.com/ReGHC.png

希望这会有所帮助!


我不断收到“导航为空”。我已经尝试了几个例子......
这是旧的,但对于未来的访问者 - 你必须在构造函数中调用它。 stackoverflow.com/a/54891361/2950032
页面刷新后还能访问状态数据吗?
好的,我自己对此进行了测试,只有在从旧组件路由到新组件后才能完美运行。重新加载页面后,状态未定义:(
在用户重新加载页面之前,这非常有效。那么状态将是未定义的。 :(
A
AliF50

我需要访问 CustomRouteReuseStrategy 中的数据,但由于循环依赖,我无法在其中注入 Router,但您也可以使用 Location 对象来读取状态。

Send:

    this.router.navigate(['action-selection'], { state: { example: 'bar' } });

Receive:
    import { Location } from '@angular/common';

    constructor(private location: Location) {
      console.log(this.location.getState().example); // should log out 'bar'
    }

S
Saurav Mohan V

@dev-nish 您的代码只需稍加调整即可工作。使

const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};

进入

let navigationExtras: NavigationExtras = {
  state: {
    transd: '',
    workQueue: ,
    services: ,
    code: ''
  }
};

那么如果您想专门发送一种数据,例如,作为表单填写的结果的 JSON,您可以按照前面解释的相同方式发送数据。


Y
Yucel Bayram

在 navigateExtra 中,我们只能传递一些特定的名称作为参数,否则会显示如下错误:对于 Ex- 在这里我想在路由器导航中传递客户密钥,我像这样传递-

this.Router.navigate(['componentname'],{cuskey: {customerkey:response.key}});

但它显示了一些错误,如下所示:

Argument of type '{ cuskey: { customerkey: any; }; }' is not assignable to parameter of type 'NavigationExtras'.
  Object literal may only specify known properties, and 'cuskey' does not exist in type 'NavigationExt## Heading ##ras'

.

解决方案:我们必须这样写:

this.Router.navigate(['componentname'],{state: {customerkey:response.key}});

A
ANKIT MISHRA

getStateById(stateId) { return this.http.get(environment.user_service_url + "/getStateById", {params:{"stateId": stateId}}); }


C
Community

我在互联网上找到的最好的是ngx-navigation-with-data。它非常简单,非常适合将数据从一个组件导航到另一个组件。您只需导入组件类并以非常简单的方式使用它。假设你有 home 和 about 组件,然后想发送数据

家庭组件

import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';

@Component({
 selector: 'app-home',
 templateUrl: './home.component.html',
 styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

constructor(public navCtrl: NgxNavigationWithDataComponent) { }

 ngOnInit() {
 }

 navigateToABout() {
  this.navCtrl.navigate('about', {name:"virendta"});
 }

}

关于组件

import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';

@Component({
 selector: 'app-about',
 templateUrl: './about.component.html',
 styleUrls: ['./about.component.css']
})
export class AboutComponent implements OnInit {

 constructor(public navCtrl: NgxNavigationWithDataComponent) {
  console.log(this.navCtrl.get('name')); // it will console Virendra
  console.log(this.navCtrl.data); // it will console whole data object here
 }

 ngOnInit() {
 }

}

对于任何查询,请按照 https://www.npmjs.com/package/ngx-navigation-with-data

评论下来寻求帮助。


它是以参数的形式传输数据还是仅在后台传输数据?
我无法理解@MariumMalik 你能以描述性的方式提问吗?
是的@MariumMalik
你似乎是这个的作者,而不是“我在互联网上找到的”?您还被要求不要在实现类似功能的 Angular 7 线程上发送垃圾邮件 (github.com/angular/angular/pull/27198)