如何在工厂提供程序中获取QueryParam(Angular4)

时间:2017-07-28 12:38:01

标签: angular angular-router angular-di

我想在我的应用程序中提供一个基于url的QueryParam的常量。

localhost:4200?flag=true

在我的模块提供商中,我添加了

{ provide: FLAG, useFactory: FlagFactory, deps: [...] }

所以我感兴趣的是,如果没有手动解析网址,有办法怎么做

function FlagFactory() {
  return location.search.includes('flag');
}

2 个答案:

答案 0 :(得分:1)

使用Angular Router怎么样?

路由器跟踪查询参数,因此它们应该在您的初始路由'/'

上可用

您的根组件可以有一个允许此

的路由
constructor(private route: ActivatedRoute) {}

  ngOnInit() {
    this.sub = this.route.params.subscribe(params => {
       this.flag = params['flag']; 

    });
  }

答案 1 :(得分:0)

我能够通过使用Angular的resolve来做到这一点。通过“解析”,可以在加载路径组件之前访问路径和查询参数。

在您的情况下,我将创建一个类似于以下内容的解析器类:

@Injectable()
export class FlagRouteResolver implements Resolve<any> {
    constructor(private flagService: FlagService) {}

    resolve(route: ActivatedRouteSnapshot) {
        this.flagService.isFlagged = route.queryParamMap.get('flag');

        // Need to return an observable for all resolve() methods
        return Observable.of(null);
    }
}

您的AppModule应该看起来像这样:

@NgModule({
    imports: [
        RouterModule.forRoot([{
            path: 'flagRoute',
            component: FlagComponent,
            resolve: { test: FlagRouteResolver }
        }]),
    ],
    providers: [
        FlagService,
        FlagRouteResolver
    ],
    declarations: [
        FlagComponent
    ]
})

现在,在路由组件中,您应该能够立即在构造函数中访问该值,如下所示:

constructor(private flagService: FlagService) {
    this.isFlagged = this.flagService.isFlagged;
}

但是,如果您仍然想注入它,也可以这样做:

providers: [{
    provide: FLAG,
    useFactory: (flagService: FlagService) => {
        return this.flagService.isFlagged;
    },
    deps: [FlagService]
}]