【问题标题】:How to get params of url from service如何从服务中获取 url 的参数
【发布时间】:2019-06-27 14:20:54
【问题描述】:

我正在尝试在我的服务中获取路由 paramMap,但订阅返回 null。但是如果我在组件中订阅返回值。

为什么??

我在服务中有这段代码

this.route.paramMap.subscribe(params => console.log(params.get('param')));

我的路径是:

{path: 'home/:param', loadChildren: './components/home/home.module#HomeModule'}

编辑

很好的解决方案: Angular 2.0.2: ActivatedRoute is empty in a Service

【问题讨论】:

标签: angular angular7


【解决方案1】:

Why?

问题是服务在应用程序启动时被初始化,然后在需要时注入任何组件。组件是根据路由变化来初始化的,所以我建议你订阅组件中的路由变化。

Workaround:

但是,如果您想获取服务中的参数,可以查看this answer。 或者 另一种选择是将组件中的数据传递给ngOnInit()上的服务

希望对你有帮助!

【讨论】:

    【解决方案2】:

    我这样使用它:使用setParams 函数在myservice 上设置属性

    import { ActivatedRoute } from '@angular/router';
    
    
    constructor(private route: ActivatedRoute, private myservice:MyService) {
    
        this.route.paramMap.subscribe(params => {
    
           console.log(params.id)
    
           this.myservice.setParams(params);
    
         });
    
     }
    

    【讨论】:

    • 我可以在服务中添加 ngOnInit() 吗?
    • Nope 在你的 ngOnInit() 或 constructor() 中设置你的参数到你的服务
    【解决方案3】:

    您无法从服务中获取路由参数。问题描述在这里,其实是:https://github.com/angular/angular/issues/11023

    如果您想获得服务中的参数,您应该将ActivatedRoute 从组件提供到服务中。

    【讨论】:

      【解决方案4】:

      ActivatedRoute 只会在目标组件中使用时返回参数。我假设您正在尝试在服务中使用 ActivatedRoute 检索参数。为此,您需要将 ActivatedRoute 从您的组件传递给您的服务,然后使用传递的值订阅参数。

      【讨论】:

        【解决方案5】:

        我不确定上面那个状态的答案是不可能在与组件不同的东西中读取 ActivatedRoute。我正在使用这个类(它甚至不是一个服务,只是一个使用 Angular DI 的原始类)并且它有效。确实,ActivatedRoute 必须在使用之前激活,但它很简单。这是我在 ActivatedRoute 中找到最后一个孩子的代码,我向你保证它可以工作:

        import { Inject } from '@angular/core';
        import { ActivatedRoute, ParamMap } from '@angular/router';
        import { Observable, of, zip } from 'rxjs';
        import { switchMap } from 'rxjs/operators';
        
        import { EResolvedorParametros } from '../enums/resolvedor-parametros.enum';
        import { IResolvedorParametros } from '../interfaces/resolvedor-parametros.interface';
        
        export class ResolvedorRouter implements IResolvedorParametros {
        
          public constructor(@Inject(ActivatedRoute) private route: ActivatedRoute) { }
        
          public intentarResolverParametro(parametro: string): Observable<string> {
            let ultimaRuta: ActivatedRoute = this.route;
            while (ultimaRuta.firstChild) {
              ultimaRuta = ultimaRuta.firstChild;
            }
            return zip(
              ultimaRuta.paramMap.pipe(switchMap((params: ParamMap): Observable<string> => {
                return of(params.get(parametro));
              })),
              ultimaRuta.queryParamMap.pipe(switchMap((params: ParamMap): Observable<string> => {
                return of(params.get(parametro));
              }))
            ).pipe(switchMap((resultados: string[]): Observable<string> => {
              let retorno: string = null;
              if (resultados) {
                retorno = resultados.find((resultado: string) => !!resultado);
              }
              return of(retorno);
            }));
          }
        
        }
        

        在该代码中,我正在从路径和查询字符串中搜索 url 中的参数,并且我没有在测试中使用该查询字符串,它总能找到我的参数。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-05
          • 2016-12-10
          • 1970-01-01
          • 2023-03-21
          • 2020-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多